您目前已離線,請等候您的網際網路重新連線

PRB: 呼叫 LoadLibrary() 載入具有靜態 TLS 的 DLL

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:118816
徵狀
動態連結程式庫 (DLL) 會使用 __declspec (執行緒) 來配置靜態執行緒區域儲存區 (TLS)。沒有與對應的靜態程式庫以執行已連結的應用程式相關聯的問題。不過,當應用程式載入使用靜態版本的 DLL 使用 LoadLibrary 函式,LoadLibrary 上失敗 Win32s 以錯誤碼 87: 無效的參數。

LoadLibrary 成功在這種情況中執行 Windows 98、 Windows NT 或 Windows 2000 的電腦上。不過,呼叫在 DLL 中參考 TLS 的靜態變數的函式的行為是未定義的。在 Microsoft Windows 95、 LoadLibrary 失敗和 GetLastError 函式傳回 1114-ERROR_DLL_INIT_FAILED (A 動態連結程式庫初始化常式失敗)。在 Windows 2000 上 LoadLibrary 函式成功]。不過,嘗試存取 TLS 資料會導致存取違規 (AV)。
發生的原因
這是 LoadLibrary__declspec 的限制。執行緒的全域變數空間被配置在執行階段。大小根據應用程式的需求加上所有靜態連結程式庫的需求計算而定。如果 DLL 使用靜態 TLS,並且是在一個應用程式中動態連結呼叫 LoadLibraryFreeLibrary 時,系統必須找到處理程序中存在與放大或壓縮新載入的 DLL 中靜態 TLS 大小根據其 TLS 記憶體的所有執行緒。這個程序是針對作業系統來管理,這樣會造成例外狀況可能是當 DLL 會動態地載入,或程式碼參考資料太多。
解決方案
使用 __declspec (執行緒) 的 DLL 應該不會載入與 LoadLibrary

若要使用這類 TLS 函式當做 TlsAlloc,],然後如果該 DLL 可能會載入與 LoadLibrary 配置 TLS 應修改 DLL 程式碼。或使用 __declspec (執行緒) 的 DLL 應該只隱含載入到應用程式。
其他相關資訊
若要判斷 DLL 是否使用靜態 TLS,Dumpbin.exe 工具可以用來傾印檔頭資訊。如果非必要的標頭值包含是大於 0 (零) 的往來文章] 存放區目錄中,如下所示的大小,DLL 會有靜態 TLS:
517B20 [18] RVA ([大小] 的執行緒儲存目錄
1.10 1.20 3.50

警告:本文為自動翻譯

內容

文章識別碼:118816 - 最後檢閱時間:11/21/2006 15:29:52 - 修訂: 3.2

Microsoft Win32 Application Programming Interface

  • kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtzh
意見反應