簡體   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