我在编程上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 ++中在最顶层文件一个可以声明和初始化这样的变量:
AClass *a = new AClass(1,2,3);
当库自动加载的代码会被执行。然而,现在,它是不可能释放悬挂实例作为库不知道准确的时候/它是如何将被卸载。在这种情况下一个可以替换“ACLASS *一个”和“一个ACLASS”或写自己的图书馆和免费资源上DLL_PROCESS_DETACH DllMain。
如果你有在库的代码无法控制,那么它可能是有意义的创建加载库的缓存,根本不会卸载它们。这是很难想象会有库的数量不受限制超载这样的高速缓存。