我有动态加载库的麻烦 - 我的代码恐慌与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__
我对此没有任何想法...非常感谢任何帮助。
P.S。我正在尝试做RLibrary :: Load因为我有静态链接的麻烦。当我进行静态链接时,我的主程序根本没有启动。我决定检查发生了什么,并用RLibrary :: Load发现了这个问题。
答案 0 :(得分:1)
KERN-EXEC 3恐慌是由于尝试无效访问内存区域而产生的未处理异常(CPU故障)引起的。这种无效的内存访问可以用于代码(例如,堆栈损坏的坏PC)或数据(例如,访问释放的内存)。因此,这些通常在取消引用NULL指针时会被观察到(它相当于段错误)。
当然,由于程序错误,对RLibrary :: Load的调用永远不应该提出KERN-EXEC 3,这可能是一个环境问题。因此,我必须推测正在发生的事情。
我认为观察到的问题是由于堆栈溢出。您的MMP文件未指定初始线程应使用的堆栈或堆大小。因此,将使用4Kb的默认值(如果我没记错的话)。同样,您正在使用TFileName - 通常不建议在堆栈上使用这些来避免堆栈溢出。
您最好使用_LIT()宏 - 这将允许您为RLibrary :: 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
答案 1 :(得分:0)
您不能使用静态链接的情况应该是对您的强烈警告。它表明您的DLL出现了问题,使用动态链接不会改变任何内容。
通常在这些情况下,问题在于功能不匹配。 DLL必须至少具有与主程序相同的功能集。所有这些功能都应该由您的开发人员证书涵盖。