共用方式為


Visual C++ 6.0 之後 DLL 延遲載入 Helper 函式的變更

更新:2007 年 11 月

如果您的電腦中有多個版本的 Visual C++ 或是您定義了自己的 Helper 函式,則可能會受到 DLL 延遲載入 Helper 函式變更的影響。例如:

  • __delayLoadHelper 現在變更為 __delayLoadHelper2

  • __pfnDliNotifyHook 現在變更為 __pfnDliNotifyHook2

  • __pfnDliFailureHook 現在變更為 __pfnDliFailureHook2

  • __FUnloadDelayLoadedDLL 現在變更為 __FUnloadDelayLoadedDLL2

注意事項:

如果是使用預設的 Helper 函式,這些變更將不會影響您。叫用連結器的方法也沒有改變。

多個版本的 Visual C++

如果您的電腦中有多個版本的 Visual C++,請確定連結器與 delayimp.lib 相符。如果不相符,將會發生連結器錯誤,回報 ___delayLoadHelper2@8 或 ___delayLoadHelper@8 為未解析的外部符號。前者表示使用新版的連結器和舊版的 delayimp.lib,後者表示使用舊版的連結器和新版的 delayimp.lib。

如果取得無法解析的連結器錯誤,請對預期包含 Helper 函式的 delayimp.lib 執行 dumpbin /linkermember:1,以查看做為替代所定義的 Helper 函式為何。也可在目的檔 (Object File) 中定義 Helper 函式;執行 dumpbin /symbols 並尋找 delayLoadHelper(2)。

如果您有 Visual C++ 6.0 連結器,那麼:

  • 對延遲載入 Helper 的 .lib 或 .obj 檔案執行 dumpbin,以確定它是否定義了 __delayLoadHelper2。如果沒有定義,連結將會失敗。

  • 在延遲載入 Helper 的 .lib 或 .obj 檔案中定義 __delayLoadHelper

使用者定義的 Helper 函式

如果您定義了自己的 Helper 函式,並使用最新版本的 Visual C++,請執行下列動作:

  • 將 Helper 函式重新命名為 __delayLoadHelper2

  • 由於延遲描述項 (delayimp.h 中的 ImgDelayDescr) 的指標已經由絕對位址 (VA) 變更為相對位址 (RVA),以便可以如預期地在 32 位元及 64 位元程式中使用,因此您必須將這些轉換回指標。之前介紹過了一個新函式:delayhlp.cpp 中的 PFromRva。您可以在描述項的每一個欄位上使用這個函式,將它們轉換回 32 或 64 位元指標。預設的延遲載入 Helper 函式將繼續當做好樣板的範例使用。

載入延遲載入 DLL 的所有匯入

連結器可以從您指定延遲載入的 DLL 載入所有匯入。如需詳細資訊,請參閱載入延遲載入 DLL 的所有匯入

請參閱

參考

了解 Helper 函式