いつもお世話になっています。
DLL を暗黙的にリンクするときに、DLL は
1. 実行中のプロセスの実行形式モジュールがあるフォルダ
2. 現在のフォルダ
の順に検索されますが、2 より優先的に
「実行中のプロセスの実行形式モジュールがあるフォルダの特定のサブフォルダ」
を検索できるように実行ファイルをビルドすることはできないでしょうか?
無理だと思います。
環境変数 PATH にサブフォルダのパスを追加するバッチファイルを作って、そこから
exe を実行すればできるかも?
aetosさんの方法でよくやってますよ。
特定のプロジェクトの時だけ設定したいPATHがある場合は結構便利です。
コンソールウインドウが出てしまいますからこれが嫌なら駄目かもしれませんけど。
バッチファイルがお手軽ではありますが、同じ役目を果たす exe を作れば、コンソール
は出さずに実行できますね。
みなさんありがとうございました。
実は EXE はすでにユーザーの PC にインストールされていて私が開発している
のはその EXE のためのプラグインです。そのプラグインは DLL として作成しま
すがその DLL は暗黙的にいろいろな DLL をリンクしています。
なのでその EXE の実行方法をプラグイン開発者が変更するのは難しいです。
そこで別の方法を思いついたのですが、EXE と現在開発しているプラグイン DLL
の間に仲介用のプラグイン DLL を置き、仲介プラグインが本来のプラグインを
LoadLibrary() してそのプラグインに処理を委譲する方法です。
仲介プラグインのエントリーポイント (DllMain 以外) の中で最初に呼び出さ
れたところで LoadLibrary() し、その DLL の各エントリーポイントへのポインタ
を取得します。このとき一時的に環境変数 PATH を書き換えて本来のプラグインが
暗黙的にリンクする DLL の検索パスを自由に変更できます。
LoadLibrary() が終わったら即座に PATH を元に戻して他のプラグインへの影響を
極力抑えます。
後は単純に取得した関数へのポインタを使って本来のプラグインへ処理を委譲する
だけです。
この方法で今までに作ったプラグインを再ビルドすることなく暗黙的にリンク
する DLL を任意の場所に移せるようになりました。
余談ですが、Windows7 & Windows Server 2008 R2 以降であれば、Private Assembly
Probing Path を指定することで、普通に暗黙リンクできると思います(未検証)。
http://msdn.microsoft.com/en-us/library/aa374182(VS.85).aspx