我正在使用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”。
任何建议都会受到欢迎。 提前致谢。 问候。
答案 0 :(得分:0)
确保加载/卸载库的初始化代码不会泄漏内存。许多库希望只加载一次,而不是总是正确地清理它们的资源。
E.g。在顶层的C ++文件中,可以声明并初始化一个变量:
AClass *a = new AClass(1,2,3);
自动加载库时将执行代码。然而,现在,由于库不能确切地知道何时/如何卸载,因此不可能释放挂起的实例。在这种情况下,可以将“AClass * a”替换为“AClass a”,也可以为库编写自己的DllMain,并在DLL_PROCESS_DETACH上编写自由资源。
如果您无法控制库的代码,那么创建已加载库的缓存并且永远不会卸载它们可能是有意义的。很难想象会有无限数量的库来重载这样的缓存。