5

LoadLibraryEx関数はサイド バイ サイド マニフェストを使用しますか? SxS マニフェストが埋め込まれた bar.dll があり、そのマニフェストにはこの bar.dll のバージョンが記述されています。他の dll ファイル foo.dll には、bar.dll を指定されたバージョンの依存関係としてリストするマニフェストがあります。しかし、foo.dll から bar.dll を読み込もうとすると、 (gflags で有効な sls を使用して) これらのマニフェストを無視し、定義して使用するとLoadLibraryEx("bar.dll", NULL, 0)、検索パスにある bar.dll の最初のバージョンを読み込むことがわかります。は適切なバージョンですが、これは の動作には影響しません。 は DLL の読み込みを遅らせるために暗黙的に使用されるため、適切なバージョンを読み込む必要があります。このように動作するはずですか、それとも私のプロジェクト構成に問題がありますか?ISOLATION_AWARE_ENABLEDLoadLibraryISOLATION_AWARE_ENABLEDLoadLibraryExLoadLibraryExLoadLibraryExLoadLibraryEx

foo dll

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="foo" version="0.1.2.3" type="win32"/>
<dependency>
    <dependentAssembly>
        <assemblyIdentity name="bar" version="0.1.2.3" type="win32" />
    </dependentAssembly>
</dependency>
<file name="foo.dll">
</file>
</assembly> 

bar.dll

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="bar" version="0.1.2.3" type="win32"/>
<file name="bar.dll">
</file>
</assembly> 
4

1 に答える 1

8

LoadLibrary呼び出しスレッドのアクティブなアクティブ化コンテキストを使用しました。しかし、このコンテキストはどれですか? なぜあなたからのものでなければならないのfoo.dllですか?なぜ exe から、xyz.dllまたは exe からではないのですか? 実際、ほとんどの場合、アクティブなアクティベーション コンテキストは exe からのものでした。

dll に独自のマニフェストがある場合 - システムはこの dll のアクティブ化コンテキストを作成し、(dll がアンロードされるまで) 保存しますが、アクティブにはしません。これは明らかに-処理中の複数のdllがありますが、アクティブなコンテキストは1つだけです-どのdllからそれを選択しますか? エグゼから。ただし、システムは、それをエントリポイントと呼ぶ前に、dll アクティベーションコンテキストをアクティブ化 (現在アクティブにする) します。エントリポイントが戻った後に非アクティブ化します。しかし、別のdll関数の中で言ってください-(誰がそれを呼び出しましたか?) コンテキストは既にあなたのdllからのものではありません。

解決策は次でなければなりません:

dll で 2 つのグローバル変数を定義します。

BOOL gActCtx;
HANDLE ghActCtx

DLL_PROCESS_ATTACH現在のアクティブ化コンテキストの保存時 (dll マニフェストから)

gActCtx = GetCurrentActCtx(&ghActCtx);

それを解放するDLL_PROCESS_DETACH

if (gActCtx) ReleaseActCtx(ghActCtx);

ロードが必要な場合bar.dllは、次のようにします。

if (gActCtx)
{
    ULONG_PTR Cookie;

    if (ActivateActCtx(ghActCtx, &Cookie))
    {
        LoadLibraryExW(L"bar.dll", NULL, 0);

        DeactivateActCtx(0, Cookie);
    }
}
于 2018-01-17T19:48:19.820 に答える