gpt4 book ai didi

c++ - Win32 DLL 导入问题 (DllMain)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:01 29 4
gpt4 key购买 nike

我有一个 native DLL,它是另一个应用程序的插件(我基本上对它的控制为零)。一切正常,直到我链接到一个额外的 .lib 文件(将我的 DLL 链接到另一个名为 ABQSMABasCoreUtils.dll 的 DLL)。该文件包含我想使用的来自父应用程序的一些附加 API。我什至没有编写任何代码来使用任何导出的函数,但只是链接到这个新的 DLL 中会导致问题。具体来说,当我尝试运行该程序时出现以下错误:

应用程序未能正确初始化 (0xc0000025)。单击“确定”终止应用程序。

我相信我在某处读到这通常是由于 DllMain 函数返回 FALSE。此外,以下消息将写入标准输出:

错误:在组件初始化之前尝试内存分配

我几乎 100% 确定此错误消息来自应用程序,而不是某种类型的 Windows 错误。

对此进行了更多研究(也就是四处乱动并翻转我所知道的每个开关)我打开了/MAP 链接并在生成的 .map 文件中找到了它:

 0001:000af220       ??3@YAXPEAX@Z              00000001800b0220 f   ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af226 ??2@YAPEAX_K@Z 00000001800b0226 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af22c ??_U@YAPEAX_K@Z 00000001800b022c f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af232 ??_V@YAXPEAX@Z 00000001800b0232 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll

如果我使用“undname”取消修饰这些名称,它们会给出以下(相同的顺序):

void __cdecl operator delete(void * __ptr64)
void * __ptr64 __cdecl operator new(unsigned __int64)
void * __ptr64 __cdecl operator new[](unsigned __int64)
void __cdecl operator delete[](void * __ptr64)

我不确定我是否理解 ABQSMABasCoreUtils.dll 中的任何内容如何存在于此 .map 文件中,或者如果我没有任何代码,我的 DLL 甚至会尝试加载 ABQSMABasCoreUtils.dll引用此 DLL。任何人都可以帮助我将这些信息放在一起并找出为什么这不起作用吗?对于它的值(value),我已经通过“dumpbin”确认父应用程序导入了 ABQSMABasCoreUtils.dll,所以它无论如何都会被加载。我也曾尝试在我的 DLL 中延迟加载此 DLL,但这并没有改变结果。

编辑

我仔细检查过,所有涉及的文件都是 64 位的。

最佳答案

我刚刚遇到了完全相同的问题。这是 Abaqus API 的问题,而不是 DLLS 的加载问题。

我认为这是因为 Abaqus API 覆盖了 new 和 delete 函数(正如您似乎已经注意到的那样)。如果您在 初始化 Abaqus API 之前在您的程序中调用 new 或 delete,例如通过调用 odb_initializeAPI();,那么您将获得

错误:在组件初始化之前尝试内存分配

错误信息和程序崩溃。

在我的程序中,在第一个 new 之前调用 odb_initializeAPI(); 解决了问题。

关于c++ - Win32 DLL 导入问题 (DllMain),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925726/

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