LoadLibraryA方法在超过1000个加载/卸载周期后返回错误代码1114(ERROR_DLL_INIT_FAILED)

时间:2010-06-10 20:43:27

标签: c++ python loadlibrary

我正在使用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”。

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

1 个答案:

答案 0 :(得分:0)

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

E.g。在顶层的C ++文件中,可以声明并初始化一个变量:

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

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

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