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

文章翻譯 文章翻譯
文章編號: 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 ([大小] 的執行緒儲存目錄

屬性

文章編號: 118816 - 上次校閱: 2006年11月21日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft Win32 Application Programming Interface?應用於:
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows XP
關鍵字:?
kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:118816
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com