2011-02-16 14 views
1

私のプロジェクトは、私のコントロール下にないホスト実行可能ファイルによってロードされるプラグイン(Windows DLL)です。私のDLLはいくつかの追加のライブラリをロードしようとしています。私は私的な集会でこれを行います。これを行う方法についてはhow can a Win32 App plugin load its DLL in its own directoryに大きな回答があります。しかし、メインDLLのリンク行に/delayload dependentlib.dllを追加すれば、アセンブリをロードするのを避けることができます(私はいろいろな理由でこれを行う必要があります)。Windowsは私のプライベートアセンブリを検索しません - コンパイルしたマニフェストを無視するようです通常の検索パスで遅延読み込みDLLを探します。 (私はこれをチェックするためにsysinternals procmonを使用します)Windowsプライベートアセンブリをどのように遅延ロードできますか?出来ますか?

これは既知のバグですか、あるいはアセンブリを遅延ロードする方法がありますか?ロードライブラリ+ GetProcAddressルートに行くのではなく、依存するlibの気になるシンボルをすべて知っておく必要があります。

答えて

1

ここで問題となるのは、遅延ロード機能への最初の呼び出しが行われたときに、アプリケーションのデフォルトアクティベーションコンテキストが現在のコンテキストであることです。

あなたがする必要があるのは、自分のマニフェストを指し示すCreateActCtx(hinstance + resource idが考えられます)です。

ActivateActCtx(および対応する非アクティブ化機能)を使用して、すべての、または少なくとも最初の呼び出しをdllでラップして、正しいアセンブリが確実に検索されるようにします。

理論的には、delayload helper関数に適切なコンテキストを有効にするコードを埋め込むことができます。

+0

ありがとうございます。あなたが正しいのは、hmoduleとリソースID(2)だけです。従属DLLへの最初の呼び出しをラップするだけです。ありがとうございました! – GaryO

0

この動作は、残念ながら仕様です。基本的に、/ DELAYLOADを指定すると、LoadLibraryとGetProcAddressの呼び出しを挿入するようにリンカーに指示するだけです。結果として、DLLのロードを遅延させるときの動作は、DLLをLoadLibraryで動的にロードする動作と同じです。

MSDNは、いくつかの結果を記載している。プラス面では、デフォルトの動作を上書きすることができます。独自の遅延ロードヘルパー機能を書くことをお勧めします。

FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, FARPROC * ppfnIATEntry) 
{ 
    //... 
} 
リンカーは、遅延ロードされたDLLのエントリポイントを解決する必要があるときはいつでも、この関数の呼び出しを挿入します。あなたのバージョンでは、プライベートアセンブリのカスタム検索を実装できます。 Here's additional information about the helper function on MSDN.
関連する問題