gpt4 book ai didi

c++ - 调用 GetProcAddress 返回的函数时出现持续访问错误

转载 作者:行者123 更新时间:2023-11-28 08:21:54 25 4
gpt4 key购买 nike

这是我的代码。这看起来很简单,但不知何故它就是行不通。对该函数的最终调用总是因访问错误而失败。

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。我没有源码,但是header中的函数原型(prototype)如下:

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 )
  • 调用返回的函数总是会抛出访问错误。我在函数的 typedef 上尝试了 _ccdecl__stdcall 等的所有组合,但总是得到相同的错误。我尝试过使用和不使用 extern C

其他数据:

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

我做错了什么?我该如何调试呢?我已经尝试过 dependency walker 和 dll export viewer,一切似乎都正常。

最佳答案

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

const char *res = iFunc();

代替

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

关于c++ - 调用 GetProcAddress 返回的函数时出现持续访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com