在MinGW下GetModuleHandle(nullptr)上的GetProcAddress()失败

时间:2018-06-20 13:59:46

标签: c++ mingw

我正在使用GetModuleHandle(nullptr)获取当前进程的句柄,然后在该句柄上使用GetProcAddress()在调用可执行文件中查找函数。

这在使用MSVC编译时效果很好,但是在MinGW下使用Clang或GCC时,GetProcAddress()调用失败,错误代码为127(ERROR_PROC_NOT_FOUND),并返回nullptr

我正在查找的功能定义为:

extern "C"
{
    void NOVA_API local_lookup_test(void* thing)
    {
        std::stringstream* out = static_cast<std::stringstream *>(thing);
        *out << "YouFoundMe!\n";
    }
}

NOVA_API宏定义为:

#ifdef _MSC_VER
#define NOVA_API __declspec(dllexport)
#else
#define NOVA_API __attribute__((visibility("default")))
#endif

该函数已正确导出,没有混乱,因为在可执行文件上运行rm显示该函数已导出:

$ nm NovaTest.exe | grep local_lookup_test
0000000000421160 T local_lookup_test

我尝试了多种方法来弄乱名称,使用不同的调用约定以不同的方式标记要导出的内容,但只有在MinGW的情况下,GetProcAddress()才会失败。

我用于获取函数指针的代码:

typedef void(*FuncType)(void*);
HMODULE handle = GetModuleHandle(nullptr);
auto func = (FuncType)GetProcAddress(handle, "local_lookup_test");

编辑:

GetModuleHandle(nullptr)返回调用过程的句柄,我用它来在调用.exe文件中动态查找函数名。

GetModuleHandle(nullptr)返回的句柄不是nullptrGetLastError()没有看到错误,所以据我所知该句柄应该是有效的。

0 个答案:

没有答案