塞班:内核EXEC 3恐慌图书馆::负荷
题
我有库的动态加载的麻烦 - 我的代码恐慌与克恩 - 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 ::负载,因为我有一个静态链接的麻烦。当我做静态链接,我的主要程序根本不会启动。我决定检查个究竟,发现有RLibrary ::加载了这个问题。
解决方案
这是你不能使用静态链接的情况下,应该是一个强烈的警告给你。这表明,有一些问题与您的DLL和动态链接不会改变任何东西。
一般在这些情况下的问题是在不匹配的能力。 DLL必须至少有一组相同的,你的主要程序有能力。而所有这些功能应该由你的开发者证书覆盖。
其他提示
一个KERN-EXEC 3恐慌是由试图访问无效地的存储器的区域中产生一个未处理的异常(CPU故障)而引起的。此无效存储器存取可以是两个代码(例如,坏PC由堆栈损坏)或数据(例如,访问存储器中解脱出来)。作为这样取消对NULL指针(它是相当于一个段错误)时这些通常观察到的。
当然,调用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