访问冲突调用导入函数

Access Violation calling imported function

本文关键字:函数 导入 调用 访问冲突      更新时间:2023-10-16

我有一个从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,但它可以接受这一点。

如果这是您在代码中使用的 DLLMain,那么它没有 return 语句,并且很可能返回一个未初始化的值,很可能是 0 作为一个好的主函数,它有效地从内存中卸载 DLL。确保 DLLMain 返回 TRUE。

我完全失败了。编写了一个管理资源的类,而不尊重我的移动并正确复制语义。事实证明,在我需要使用它之前,我错误地在有问题的库上调用了FreeLibrary()