c++ 延迟加载DLL:“异常0xC06D007E:应用程序多次启动时未找到”模块

ddarikpa  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(296)

我在我的应用程序中有一个间歇性崩溃的案例,我们使用了延迟加载DLL。有几个不同的调用栈,我们已经看到了崩溃,但它总是崩溃时,引发__delayLoadHelper2__delayLoadHelper2
在一行中多次(连续)调用进程时会引发异常错误。下面是一个示例调用堆栈:

KERNELBASE.dll!RaiseException()  + 0x3d bytes   
MYDLL.dll!__delayLoadHelper2(const ImgDelayDescr * pidd=0x000000000012f650, __int64 (void)* * ppfnIATEntry=0x000000000012f570)  Line 331    C++
MYDLL.dll!__tailMerge_MyDelayLoadDLL_dll()  + 0x3f bytes    Unknown
MYDLL.dll!MyUserFunction()  Line 91 + 0x5 bytes C++

c++应用程序正在使用延迟加载DLL加载.NET代码。
发生崩溃的计算机是一台非常强大的计算机(12核CPU,48 gig内存),我不确定它是否对它有影响。但由于崩溃并不总是发生,它看起来像一个竞争条件,或资源问题。
This forum thread描述了我的情况,但没有解决方案。
知道为什么会这样吗?

brgchamk

brgchamk1#

我的应用程序也有同样的崩溃,调用堆栈也完全一样。但是我的崩溃不同,因为一个本机DLL对另一个本机DLL有延迟加载依赖。
我永远不会延迟加载.NET程序集。.NET程序集应该使用托管程序集加载器函数来加载。它们也不应该通过对它们调用LoadLibrary来加载。
最后,我不确定是什么导致了崩溃,但我会完全删除.NET程序集的延迟加载。

4nkexdtk

4nkexdtk2#

当我试图在另一台没有Visual Studio C运行时调试版本的计算机上运行我的程序的调试版本时,我遇到了这个问题。(调试dll的命名通常稍有不同,在程序集名称的某个地方有一个额外的“D”)
我的程序的发行版配置工作得很好,因为我在它上面有可再发行的VS C
运行时。
为了完整起见,我将给出这个问题的显而易见的答案,但我真诚地不想让它看起来居高临下...模块加载器找不到它所依赖的模块!我越是解决类似的问题,我就越告诉自己“相信错误消息”
Dependency步行者(dependency.exe)在这种情况下应该是您的朋友,尽管我不能肯定地说它如何处理延迟加载的模块。

相关问题