繁体   English   中英

Win32 DLL导入问题(DllMain)

[英]Win32 DLL importing issues (DllMain)

我有一个本机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任何ABQSMABasCoreUtils.dll可以存在于此.map文件中,或者为什么我的DLL甚至尝试加载ABQSMABasCoreUtils.dll如果我没有任何引用此DLL的代码。 任何人都可以帮我把这些信息放在一起,找出为什么这不起作用? 值得我通过“dumpbin”确认父应用程序导入了ABQSMABasCoreUtils.dll ,因此ABQSMABasCoreUtils.dll加载它。 我也试过延迟加载我的DLL中的DLL,但这并没有改变结果。

编辑

我进行了双重检查,所涉及的所有文件都是64位。

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

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

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

错误消息和程序崩溃。

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

那么,确定你会引用该库的导入。 很难在不使用new或delete运算符的情况下编写C ++程序。 处理认为需要覆盖这些运营商的CRT版本的第三方软件是很难的,当它认为时机成功时它不允许你打电话给它们是不可能的。 放弃所有希望或寻求供应商的帮助。

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

我有两个建议:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM