4

アプリケーション ディレクトリに C++ Exe があり、それによって使用される DLL が含まれています。ここで、いくつかのテスト目的で、既存の DLL を変更し、元の DLL の代わりにそれを使用する必要があります。しかし、既存のインストールを変更しないために、既存の DLL をバックアップして変更したものに置き換えたり、既存のものを別の場所に移動したりすることはできません。Exeも変更できません。2 つの DLL が並んで存在する必要があります。唯一の変更点は、Exe が、Exe と同じフォルダーにある既存の DLL ではなく、他のフォルダーにある変更された DLL を透過的にロードする必要があることです。それを行うエレガントな方法はありますか?

MSDN の記事をいくつか見ましたが、これを行う方法が見つかりませんでした。このソリューションは、Windows XP 以降で動作するはずです。

4

4 に答える 4

2

Windows は、プロセスごとに各 DLL 名の最大 1 つのバージョンを読み込みます。にリストされている DLL をHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLsロードすると、後で同様の名前の DLL はロードされません。ただしAppInit_DLLs、通常の LoadLibrary() の順序をオーバーライドして、明示的なパスを使用して DLL をリストすることができます。

したがって、一時的にテスト DLL を配置するAppInit_DLLsと、同じ名前の他の DLL がオーバーライドされます。

于 2009-10-26T12:03:18.567 に答える
1

MSDNによると、常にアプリケーション ディレクトリから開始されるため (別の検索順序の方法で変更しない限り...)、難しいようです。実行可能ファイルとそのその他の依存関係を別の場所にコピーすることはできます。それほどエレガントではありません。

または、別の場所にコピーした実行可能ファイルを新しい DLL と共に元のディレクトリから起動することもできます。検索順序によれば、それも機能するはずですが、試したことがないことを認めなければなりません。

于 2009-10-23T17:10:17.250 に答える
0

最初からプロセスの LoadLibrary() 呼び出しをフックできます。パッチを適用したバージョンの LoadLibrary() が DLL を認識すると、変更された DLL のパスで元の LoadLibrary() を呼び出します。したがって、この手法は機能する必要があります。

于 2009-10-25T01:50:08.573 に答える
-1

私が知っている唯一の方法は、パスを含む LoadLibrary API を使用することですが、exe を変更できないと言います。

于 2009-10-23T16:57:40.020 に答える