我正在使用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)
返回的句柄不是nullptr
,GetLastError()
没有看到错误,所以据我所知该句柄应该是有效的。