我有一个从DLL导入的函数。我控制主机可执行文件和动态库的源。现在,在DLLMain中,我使用MessageBox弹出我正在导出的函数的地址,并使用断点将其与GetProcAddress返回的函数指针进行比较,它们是相同的。
但是,当我尝试调用该函数时,会出现访问冲突。有问题的函数只返回NULL并且没有逻辑,所以它不能被函数特别抛出。
如何使用正确的签名和经过验证的安全逻辑调用已知的有效函数指针会产生访问冲突?
编辑:通过另一个单独的问题获得的信息,说明调试器在这种情况下死亡的原因表明我的堆栈也被粉碎了?这比AV更有意义,但函数指针和函数完全兼容,地址正确。
extern "C" Render* __cdecl CreateRender(WindowsOS* ptr) {
return nullptr;
}
typedef Render*(__cdecl *RendererCreateFunction)(WindowsOS*);
我在DLLMain中使用了一段简单的小代码来证明它们在编译器方面实际上是兼容的。
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
) {
RendererCreateFunction func = &CreateRender;
}
如果它们不兼容(它们包含相同的标头),那么编译器应抛出错误并拒绝构建DLL,但它接受这一点就好了。
答案 0 :(得分:1)
如果这是你在代码中使用的DLLMain,那么它没有return语句,并且很可能返回一个未初始化的值,很可能是0作为一个好的主函数,它有效地从内存中卸载DLL。确保DLLMain返回TRUE。
答案 1 :(得分:0)
我完全失败了。写了一个管理资源的类,而不尊重我的移动并正确地复制语义。事实证明,在我需要使用它之前,我错误地在库中调用了FreeLibrary()
。