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

问题描述 投票:0回答:1

我在编程上C ++,我使用Visual Studio 2008,Windows XP和我有以下问题:我的应用程序,这是可以从Python中使用的DLL,加载外部的dll,使用所需的方法和然后卸载这个外部DLL。它的正常工作,但超过1000次循环的方法后,“LoadLibraryA”返回空引用。

其主要步骤是:

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。

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

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

c++ python loadlibrary
1个回答
0
投票

确保加载/卸载库的初始化代码不会泄露内存。许多图书馆指望只有一次,而不是总是加载正确清理自己的资源。

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

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

当库自动加载的代码会被执行。然而,现在,它是不可能释放悬挂实例作为库不知道准确的时候/它是如何将被卸载。在这种情况下一个可以替换“ACLASS *一个”和“一个ACLASS”或写自己的图书馆和免费资源上DLL_PROCESS_DETACH DllMain

如果你有在库的代码无法控制,那么它可能是有意义的创建加载库的缓存,根本不会卸载它们。这是很难想象会有库的数量不受限制超载这样的高速缓存。

© www.soinside.com 2019 - 2024. All rights reserved.