سؤال

لدي مشكلات مع التحميل الديناميكي للمكتبات - ذعر الكود الخاص بي مع Kern -Exec 3. الرمز كما يلي:

TFileName dllName = _L("mydll.dll");
TFileName dllPath = _L("c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(dllName, dllPath); // Kern-Exec 3!
TLibraryFunction f = dll.Lookup(1);
if (f)
    f();

أتلقى الذعر TInt res = dll.Load(dllName, dllPath); ماذا يمكنني أن أفعل للتخلص من هذا الذعر؟ mydll.dll هو حقًا DLL الخاص بي ، والذي يحتوي على وظيفة تصدير واحدة فقط (لأغراض الاختبار). ربما شيء خاطئ مع DLL؟ هذا ما هو عليه:

ملف def:

EXPORTS
_ZN4Init4InitEv @ 1 NONAME

ملف PKG:

#{"mydll DLL"},(0xED3F400D),1,0,0


;Localised Vendor name
%{"Vendor-EN"}

;Unique Vendor name
:"Vendor"

"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\mydll.dll"-"!:\sys\bin\mydll.dll"

ملف MMP:

TARGET        mydll.dll
TARGETTYPE    dll
UID          0x1000008d 0xED3F400D

USERINCLUDE  ..\inc
SYSTEMINCLUDE   \epoc32\include

SOURCEPATH    ..\src

SOURCE        mydllDllMain.cpp
LIBRARY      euser.lib

#ifdef ENABLE_ABIV2_MODE
DEBUGGABLE_UDEBONLY
#endif

EPOCALLOWDLLDATA

CAPABILITY CommDD LocalServices Location MultimediaDD NetworkControl NetworkServices PowerMgmt ProtServ ReadDeviceData ReadUserData SurroundingsDD SwEvent TrustedUI UserEnvironment WriteDeviceData WriteUserData

مصدر الرمز:

//  Exported Functions
namespace Init
    {
    EXPORT_C TInt Init()
        {
        // no implementation required
        return 0;
        }
    }

الملف الاساسي:

#ifndef __MYDLL_H__
#define __MYDLL_H__

//  Include Files

namespace Init
{
    IMPORT_C TInt Init();
}

#endif  // __MYDLL_H__

ليس لدي أي أفكار حول هذا ... أي مساعدة موضع تقدير كبير.

ملاحظة: أحاول القيام rlibrary :: تحميل لأن لدي مشكلات مع ربط ثابت. عندما أقوم بربط ثابت ، لا يبدأ برنامجي الرئيسي على الإطلاق. قررت التحقق من ما يحدث واكتشفت هذه المشكلة مع RLIBRARY :: LOAD.

هل كانت مفيدة؟

المحلول

يجب أن تكون الحالة التي لا يمكنك استخدام الربط الثابت تحذيرًا قويًا لك. إنه يوضح أن هناك خطأ ما في DLL الخاص بك وأن استخدام الارتباط الديناميكي لن يغير أي شيء.

عادة في هذه الحالات ، تكون المشكلة في قدرات غير متطابقة. يجب أن يكون لدى DLL نفس المجموعة على الأقل من القدرات التي يتمتع بها برنامجك الرئيسي. وينبغي أن تتم تغطية كل هذه القدرات من قبل Developer Cert.

نصائح أخرى

يحدث الذعر Kern-Exec 3 بسبب استثناء غير معتمد (خطأ وحدة المعالجة المركزية) الناتجة عن محاولة الوصول إلى منطقة الذاكرة بشكل غير صالح. يمكن أن يكون الوصول إلى الذاكرة غير الصحيح لكلا الرمز (على سبيل المثال ، الكمبيوتر السيئ عن طريق تفسد المكدس) أو البيانات (على سبيل المثال ، الوصول إلى الذاكرة المحررة). على هذا النحو ، يتم ملاحظتها عادة عند إزالة مؤشر فارغ (يعادل Segfault).

من المؤكد أن الدعوة إلى RLIBRARY :: يجب ألا ترفع أبدًا KERN-EXEC 3 بسبب الخطأ البرنامجي ، فمن المحتمل أن تكون مشكلة بيئية. على هذا النحو ، يجب أن أتكهن بما يحدث.

أعتقد أن القضية التي لوحظ ترجع إلى فائض المكدس. لا يحدد ملف MMP الخاص بك حجم المكدس أو الكومة الذي يجب أن يستخدمه مؤشر الترابط الأولي. على هذا النحو ، سيتم استخدام الافتراضي لـ 4kb (إذا كنت أتذكر بشكل صحيح). بنفس القدر ، فأنت تستخدم tfilename - لا ينصح باستخدام هذه على المكدس بشكل عام لتجنب ... فائض مكدس.

سيكون من الأفضل لك استخدام الماكرو _lit () بدلاً من ذلك - سيتيح لك ذلك توفير وظيفة RLIBRARY :: مع واصف يشير مباشرة إلى السلاسل الثابتة كما هو الحال في قسم البيانات الثابت في الثنائي.

كملاحظة جانبية ، يجب عليك التحقق من قيمة الخطأ لتحديد نجاح استدعاء الوظيفة.

_LIT(KMyDllName, "mydll.dll");
_LIT(KMyDllPath, "c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(KMyDllName, MyDllPath); // Hopefully no Kern-Exec 3!
if(err == KErrNone)
    {
    TLibraryFunction f = dll.Lookup(1);
    if (f)
        f();
    }
// else handle error
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top