6

我有一个本机 DLL,它是另一个应用程序的插件(我对它的控制基本上为零)。一切都很好,直到我链接了一个额外的 .lib 文件(将我的 DLL 链接到另一个名为 的 DLL ABQSMABasCoreUtils.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如果我没有任何引用此 DLL 的代码,我不确定我是否了解此 .map 文件中如何存在任何内容,或者为什么我的 DLL 甚至试图加载 ABQSMABasCoreUtils.dll。谁能帮我把这些信息放在一起,找出为什么这不起作用?对于它的价值,我已经通过“dumpbin”确认父应用程序导入ABQSMABasCoreUtils.dll,所以无论如何它都会被加载。我也尝试过在我的 DLL 中延迟加载这个 DLL,但这并没有改变结果。

编辑

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

4

4 回答 4

5

我只是遇到了同样的问题。这是 Abaqus API 的问题,而不是 DLLS 的加载问题。

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

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

错误消息和程序崩溃。

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

于 2010-11-12T09:18:05.873 回答
2

好吧,您肯定会引用该库的导入。如果不使用 new 或 delete 运算符,很难编写 C++ 程序。处理认为需要覆盖这些运营商的 CRT 版本的 3rd 方软件已经够难的了,如果它不允许你调用它们,直到它认为时机成熟,这是不可能的。放弃所有希望或向供应商寻求帮助。

于 2010-05-27T23:45:38.860 回答
1

加载 ABQSMABasCoreUtils.dll 期间出错的可能原因之一是找不到某些依赖模块(包括延迟加载 DLL)。使用Dependency Walker(参见http://www.dependencywalker.com/)检查 ABQSMABasCoreUtils.dll 的所有依赖项。

我有两个建议:

  1. 验证您是否可以加载 ABQSMABasCoreUtils.dll 与LoadLibrary. 您不需要从 ABQSMABasCoreUtils.dll 调用任何函数。使用LoadLibrary我不认为是最终解决方案。这只是一个诊断测试。通过测试,您可以验证是否存在在程序中加载 ABQSMABasCoreUtils.dll 的一般问题,或者存在某种进程初始化问题。
  2. 如果加载 ABQSMABasCoreUtils.dllLoadLibrary将失败,则使用 Dependency Walker 的分析功能对加载 ABQSMABasCoreUtils.dll 期间完成的所有调用进行协议。另一种方法是使用 Process Monitor(请参阅http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)来跟踪加载 ABQSMABasCoreUtils.dll 期间将执行哪些文件和注册表操作。

如果LoadLibrary没有失败,那么您确实有 DLL 的初始化问题。通常,如果 DllMain 中的 DLL 尝试使用另一个 DLL 中尚未初始化的函数(尚未从 DllMain 返回),则通常会出现问题。在开始诊断这个问题之前,我们应该尝试排除一个更简单的问题LoadLibrary

于 2010-05-28T09:58:41.647 回答
0

ABQSMABasCoreUtils.dll 看起来像是在导入 64 位函数。你的dll也是64位的吗?如果不是,那么这就是问题所在 - 您不能在同一进程中混合为不同架构编译的 DLL。

于 2010-05-27T23:36:03.493 回答