延遲載入 DLL 的條件約束
更新:2007 年 11 月
匯入的延遲載入有下列的條件約束:
不支援資料的匯入。解決的方法是自行利用 LoadLibrary (或在知道延遲載入 Helper 已經載入 DLL 後,使用 GetModuleHandle) 和 GetProcAddress 明確地處理資料的匯入。
不支援 Kernel32.dll 的延遲載入。延遲載入 Helper 常式執行延遲載入時需要這個 DLL。
不支援轉送的進入點繫結。
如果在延遲載入的 DLL 的進入點處發生前置處理初始化,延遲載入 DLL 的結果可能與處理行為不同。其他情形包括使用 __declspec(thread) 來宣告的靜態 TLS (執行緒區域儲存區,Thread Local Storage),該 TLS 在 DLL 是透過 LoadLibrary 載入時不會被處理。使用 TlsAlloc、TlsFree、TlsGetValue、TlsSetValue 的動態 TLS 還是可以用於靜態或延遲載入的 DLL 中。
靜態 (全域) 函式指標應該在第一次呼叫函式後,重新初始化為匯入函式,這是因為函式指標第一次使用時將指向 Thunk。
在使用一般的匯入機制時,目前還沒有方法可以只延遲載入 DLL 中特定的程序。
不支援自訂的呼叫慣例 (Calling Convention,例如在 x86 架構中使用條件代碼),也無法在 RISC 機器上的任何 Helper 常式或攔截中使用浮點資料型別。任何平台都不會儲存浮點暫存器。如果您的自訂 Helper 常式或攔截常式使用浮點型別,則它們需要以具有浮點參數的暫存器呼叫慣例來完全儲存和還原電腦上的浮點狀態。如果您在 Help 函式中的數值資料處理器 (NDP) 堆疊上呼叫接受浮點參數的 CRT 函式,請小心延遲載入 CRT DLL。