gpt4 book ai didi

c++ - 调用导入函数的访问冲突

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:52 25 4
gpt4 key购买 nike

我有一个从 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;
}

如果它们不兼容(它们包含相同的 header ),那么编译器应该抛出一个错误并拒绝构建 DLL,但它接受这个就好了。

最佳答案

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

关于c++ - 调用导入函数的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6203429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com