访问冲突调用导入函数
Access Violation calling imported function
我有一个从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()
。
相关文章:
- 是否可以将函数导入命名空间,但不能导出它?
- 使用导入的函数从嵌入式v8调用webassembly
- C ++ DLL导入:函数调用返回错误的结果
- 编译器如何知道 dll 导入的函数?
- 导入的库函数是否可以在内存中移动
- 在C++中导入 DLL 函数
- 我将类型库(.tlb)导入到Delphi中,但函数参数似乎不正确.我应该如何解决它
- 使用dllimport属性导入的函数参数
- 除了两个构造函数外,C++库导入也可以工作
- 宏导入外部函数
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效
- 在另一个应用程序中嵌入python时,如何在子模块(即scipy.optimize.nnls)中导入或调用函数
- 我可以从C 中的库中包括/导入单个函数吗?
- 无法从导入的类 c++ 调用非静态成员函数
- 我对此C++函数的 C# DLL 导入进行封送处理有什么问题
- 我可以用错误的签名调用用dlsym()导入的函数,为什么
- 将C++函数导入为蓝图节点
- 将.cpp文件中的函数导入python
- 将c++函数导入teradata
- 用于将修饰的C++函数导入C++的GetProcAddress