2011-02-16 72 views
1

我的項目是一個插件(Windows DLL),由不在我控制下的主機可執行文件加載。我的DLL想要加載一些額外的庫。我用私人程序集來做這件事。在how can a Win32 App plugin load its DLL in its own directory有一個很好的答案如何做到這一點。但是,如果我在主DLL的鏈接行上添加/delayload dependentlib.dll以避免加載程序集(直到它需要)(Windows出於各種原因必須這樣做),Windows不再搜索我的私有程序集 - 似乎忽略了我編譯的清單。它會在通常的搜索路徑中查找延遲加載的DLL。 (我使用Sysinternals的procmon中進行檢查。)如何延遲加載Windows專用程序集?可能嗎?

這是一個已知的bug,或者是有任何其他方式來延遲加載程序集?我寧願不去LoadLibrary + GetProcAddress路線,在那裏我必須知道所關心的依賴庫中的所有符號。

回答

1

你這裏的問題是,由一個延遲加載函數的第一個呼叫時,應用程序默認激活上下文是當前上下文。

你需要做的就是創建一個激活上下文:CreateActCtx在你自己的清單(HINSTANCE +資源ID是可能的,我認爲)指向。

然後,用ActivateActCtx(和相應的停用函數)將所有或至少第一次調用dll,以確保搜索正確的程序集。

從理論上講,你可以只嵌入代碼以激活DELAYLOAD helper功能適當的上下文。

+0

謝謝 - 完美的工作。你是對的,你需要的只是模塊和資源ID(2)。然後包裝第一個調用到依賴dll是需要的。謝謝加載! – GaryO

0

此行爲是設計,很遺憾。本質上,當你指定/ DELAYLOAD時,你只是指示鏈接器爲你插入LoadLibrary和GetProcAddress調用。因此,延遲加載DLL時的行爲與使用LoadLibrary動態加載DLL相同。

MSDN介紹了一些後果。另一方面,您可以覆蓋默認行爲。我建議編寫自己的延遲加載助手功能。

FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, FARPROC * ppfnIATEntry) 
{ 
    //... 
} 

只要需要在延遲加載的DLL中解析入口點,鏈接器就會向該函數插入調用。您的版本可以實現您的私人程序集的自定義搜索。 Here's additional information about the helper function on MSDN.