C++ 调用GetProcAddress返回的函数时发生持久访问错误

C++ 调用GetProcAddress返回的函数时发生持久访问错误,c++,loadlibrary,getprocaddress,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);

这是我的密码。这似乎很难做到,但不知何故,它就是不起作用。 最后一次调用函数总是失败,并出现访问错误

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本身依赖于存储在目录“C:\MyDllDir”中的其他几个dll,因此调用SetDllDirectory

一些意见:

  • 我无法让vanilla LoadLibrary正常工作,但是带有参数的
    LoadLibraryEx
    似乎可以正常工作(即
    GetLastError
    返回
    0
  • 返回的dll地址似乎很奇怪(
    0x4390000
  • GetProcAddress
    返回的函数地址也是奇数(
    0x43902b34
    ),但令人放心的是,DLL导出查看器报告Init函数的偏移量为
    0x00002b34
  • 调用返回的函数总是引发访问错误。我在函数的
    typedef
    上尝试了
    \u ccdecl
    \u stdcall
    等的每一种组合,但总是得到相同的错误。我试过使用和不使用
    extern C
其他数据:

  • 这段C++代码是从托管环境< /LI>调用的
  • 我在64位windows 7上运行,但将非托管部分编译为win32

我做错了什么?我如何调试这个?我试过dependency walker和dll export viewer,看起来一切正常。

一切正常。当您通过指针调用函数时,不需要使用
*
。将其称为普通函数:

const char *res = iFunc();
而不是

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