Symbian: Kern-Exec 3 Panic на Rlibrary :: Load
Вопрос
У меня проблемы с динамической загрузкой библиотек - мой код паникой с 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, которая имеет только 1 экспортированную функцию (для тестовых целей). Может быть что-то не так с 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__
У меня нет идей об этом ... Любая помощь значительно ценится.
PS Я пытаюсь сделать RLIBRARY :: Нагружать, потому что у меня проблемы с статической связью. Когда я делаю статическую связь, моя главная программа вообще не запускается. Я решил проверить, что происходит и обнаружило эту проблему с RLIBRARY :: Load.
Решение
Дело, что вы не можете использовать статический накладки, должен быть вам сильным предупреждением. Это показывает, что с вашей DLL есть что-то не так, и используя динамическое связывание, ничего не изменится.
Обычно в этих случаях проблема не связана с несоответствиями. DLL должен иметь хотя бы тот же набор возможностей, которые имеет ваша главная программа. И все эти возможности должны быть покрыты вашим разработчиком Cert.
Другие советы
Паника Kern-Exec 3 вызвана неверным исключением (неисправность CPU), сгенерированным, пытаясь невернительно получить доступ к области памяти. Этот недопустимый доступ памяти может быть для обоих кодов (например, плохого ПК путем повреждения стека) или данных (например, доступ к свободной памяти). Как таковые они обычно наблюдаются при размывании нулевого указателя (это эквивалентно SegFault).
Конечно, вызов RLIBRARY :: нагрузка никогда не должна вызывать kern-exec 3 из-за программной ошибки, вероятно, будет экологическая проблема. Как таковой я должен спекулировать на том, что происходит.
Я считаю, что этот наблюдаемый вопрос связан с переполнением стека. Ваш файл MMP не указывает размер стека или кучи. Начальная нить должна использовать. Как такое значение по умолчанию 4 КБ (если я запомню правильно), будет использоваться. В равной степени вы используете TFileName - использование этих в стеке, как правило, не рекомендуется избегать ... переполнение стека.
Вместо этого вам будет лучше, используя вместо этого макроса _LIT () - это позволит вам предоставить функцию RLLIBRARY :: LOAD с дескриптором, непосредственно ссылающимся на постоянные строки, расположенные в разделе постоянного данных двоичных данных.
В качестве бокового примечания вы должны проверить значение ошибки, чтобы определить успех вызова функции.
_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