【发布时间】:2010-05-27 23:26:50
【问题描述】:
我有一个本地 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 的代码,为什么我的 DLL 甚至试图加载 ABQSMABasCoreUtils.dll。谁能帮我把这些信息放在一起,找出为什么这不起作用?值得我通过“dumpbin”确认父应用程序导入ABQSMABasCoreUtils.dll,所以无论如何它都会被加载。我也尝试过延迟在我的 DLL 中加载这个 DLL,但这并没有改变结果。
编辑
我已经仔细检查过,所有涉及的文件都是 64 位的。
【问题讨论】:
-
您是否尝试过使用
LoadLibrary而不是导入库的静态链接?如果你这样做,你的主应用程序已经初始化,你有一些优势。 -
我想到了这一点,但我最终会使用这个库中的大量函数。我不必为每个人使用 GetProcAddress 吗?如果可能的话,我宁愿避免这种情况。
-
C0000025 = STATUS_NONCONTINUABLE_EXCEPTION。尝试在 windbg 中运行应用程序,看看它在哪里崩溃;也许这会给你一个提示。