Вопрос

У меня проблемы с динамической загрузкой библиотек - мой код паникой с 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top