0

这是我的代码。这似乎很简单,但不知何故它就是行不通。对函数的最终调用总是失败并出现访问错误。

extern "C"
{
    typedef const char* (*Init_fptr_t)();

    HMODULE CMolNet::LoadDLL()
    {
       string dir = "C:\\MyDllDir\\";
       CA2W dirw( dir.c_str() );
       SetDllDirectory(dirw);

       string dllfile = CombinePath(dir.c_str(), "mydll.dll");
       CA2W dllfilew( dllfile.c_str() );

       mDLL = LoadLibraryEx(dllfilew,0,LOAD_WITH_ALTERED_SEARCH_PATH);
       DWORD err = GetLastError();

       Init_fptr_t iFunc = (Init_fptr_t)GetProcAddress(mDLL,"Init");
       const char *res = (*iFunc)();
    }
}

mydll.dll 是第三方 dll。我没有源码,但是头文件中的函数原型如下:

extern "C" {
   const char* Init();
}

mydll.dll 本身依赖于其他几个 dll,存储在目录“C:\MyDllDir”中,因此调用了 SetDllDirectory。

一些观察:

  • 我无法让 vanilla LoadLibrary 工作,但LoadLibraryEx参数似乎可以工作(在那个GetLastError返回0
  • 返回的 dll 的地址看起来很奇怪 ( 0x43900000)
  • 返回的函数地址GetProcAddress也是奇数 ( 0x43902b34),但令人欣慰的是 DLL Export Viewer 报告 Init 函数的偏移量为0x00002b34)
  • 调用返回的函数总是会引发访问错误。我已经在函数上尝试了_ccdecl,__stdcall等的每种组合,typedef但总是得到相同的错误。我试过有和没有extern C

其他数据:

  • 这段 c++ 代码是从托管环境中调用的
  • 我在 Windows 7、64 位上运行,但将非托管部分编译为 win32

我究竟做错了什么?我该如何调试呢?我已经尝试过依赖 walker 和 dll 导出查看器,一切似乎都很好。

4

1 回答 1

1

一切都很好。*当您通过指针调用函数时,您不需要使用。像普通函数一样调用它:

const char *res = iFunc();

代替

const char *res = (*iFunc)();
于 2011-06-03T21:39:06.567 回答