调用GetProcAddress返回的函数的持久访问错误

时间:2011-04-02 03:41:35

标签: c++ loadlibrary getprocaddress

这是我的代码。这似乎很简单,但不知何故它只是不起作用。 对函数的最终调用总是因访问错误而失败。

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导出查看器报告Init函数的偏移量为0x00002b34
  • 调用返回的函数始终会引发访问错误。我在_ccdecl上尝试了__stdcalltypedef等的所有组合,但总是得到相同的错误。我曾尝试使用和不使用extern C

其他数据:

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

我做错了什么?我该怎么调试呢?我已经尝试过依赖walker和dll导出查看器,一切似乎都没问题。

1 个答案:

答案 0 :(得分:1)

一切都很好。当您通过指针调用函数时,您不需要使用*。称之为普通功能:

const char *res = iFunc();

而不是

const char *res = (*iFunc)();