繁体   English   中英

LoadLibraryA 方法在超过 1000 次加载/卸载循环后返回错误代码 1114 (ERROR_DLL_INIT_FAILED)

[英]The LoadLibraryA method returns error code 1114 (ERROR_DLL_INIT_FAILED) after more than 1000 cycles of loading/unloading

我正在使用 C++ 进行编程,我使用的是 Visual Studio 2008、Windows XP,但我遇到了以下问题:我的应用程序是一个可以从 Python 使用的 DLL,加载了一个外部 dll,使用了所需的方法,并且然后卸载这个外部 Dll。 它工作正常,但经过 1000 多个循环后,方法“LoadLibraryA”返回 NULL 引用。

主要步骤是:

HINSTANCE h = NULL;
h = LoadLibraryA(dllfile.c_str());
DWORD dw = GetLastError(); 

得到的错误是:

ERROR_DLL_INIT_FAILED
1114 (0x45A) A dynamic link library (DLL) initialization routine failed.

使用以下命令卸载 Dll:

FreeLibrary(mDLL);
mDLL = NULL;

其中 mDLL 是这样定义的:

HINSTANCE mDLL;

尝试的第一种替代方法:只加载一次 Dll,并在应用程序结束时卸载它。 这解决了问题,但引入了一个新问题。

当应用程序结束时,不是首先执行我的应用程序的 DllMain 方法,即卸载外部 DLL,而是首先执行另一个 Dll 的 DllMain 方法。 这会导致以下错误,因为我的应用程序正在尝试卸载之前自行卸载的 Dll。

“Python.exe 中 0x04a00d07 (DllName.DLL) 处的未处理异常:0xC0000005:访问冲突读取位置 0x0000006b”。

任何建议将受到欢迎。 提前致谢。 问候。

确保加载/卸载库的初始化代码不会泄漏内存。 许多库希望只加载一次,并不总是正确清理它们的资源。

例如,在顶层的 C++ 文件中,可以像这样声明和初始化一个变量:

AClass *a = new AClass(1,2,3);

代码将在库自动加载时执行。 然而,现在不可能释放挂起的实例,因为库不知道它何时/如何被卸载。 在这种情况下,可以将“AClass *a”替换为“AClass a”或为库编写自己的DllMain ,并在 DLL_PROCESS_DETACH 上释放资源。

如果您无法控制库的代码,那么创建加载库的缓存并且永远不要卸载它们可能是有意义的。 很难想象会有无限数量的库来超载这样的缓存。

暂无
暂无

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

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