0

我在动态加载库时遇到问题 - 我的代码与 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有问题?它是这样的:

定义文件:

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::Load 因为我在静态链接方面遇到了麻烦。当我进行静态链接时,我的主程序根本没有启动。我决定检查发生了什么,并发现 RLibrary::Load 存在这个问题。

4

2 回答 2

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
于 2010-10-27T14:18:07.023 回答
0

您不能使用静态链接的情况应该是对您的强烈警告。它表明你的 DLL 有问题,使用动态链接不会改变任何东西。

通常在这些情况下,问题在于功能不匹配。DLL 必须至少具有与您的主程序相同的一组功能。您的开发人员证书应涵盖所有这些功能。

于 2010-10-28T06:33:10.450 回答