2011-11-22 15 views
1

私はCreateProcessを使ってC++アプリケーションから外部プロセスを実行しようとしています。CreateProcessはlpCurrentDirectory /親作業ディレクトリを無視します

起動したアプリケーションは、そのディレクトリにあるdllを検索すると失敗します。

プロセスエクスプローラ(sysinternalsから)でexecutwdプロセスを調べると、プロセス作業ディレクトリは親作業ディレクトリではなくc:\ windowsであることがわかります。

lpCurrentDirectoryを使用して作業ディレクトリをハードコードすることも役に立ちません。

システムコマンドを使用すると、プロセスが正しく実行されます。

EDIT 問題のあるディレクトリはモジュールディレクトリではなく、現在の作業ディレクトリです。

modulesディレクトリは、期待通りに検索されますが、DLL が含まれていません(モジュールディレクトリにSLLをコピーする、それブタSA回避策を作品)

+2

DLLをロードする実行可能モジュールがからロードされたディレクトリである場合は、Windowsが見える最初の場所。あなたのDLLがそこにあれば、それが見つかるでしょう。問題は明らかにそれがあなたが思うものではありません。 –

答えて

2

あなたはCreateProcess関数を使用する場合は、最初のディレクトリが検索呼び出しプロセスを作成するために使用されるイメージファイルを含むディレクトリです。これにより、PATH環境変数にプロセスのインストールディレクトリを追加せずに、プロセスに関連付けられたプライベートダイナミックリンクライブラリ(DLL)ファイルを検出できます。 Dllファイルが見つからない場合、system32や%windir%など、システムフォルダ内のこれらのファイルが検索されます。

検索パスは、SetDllDirectory関数を使用して変更できます。 SetCurrentDirectoryを使用するか、DLLへのフルパスをハードコードする代わりに、このソリューションをお勧めします。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682600%28v=vs.85%29.aspx

+0

起動したプロセスがDLLではなくリソースファイルを探している場合はどうなりますか?また、IpCurrentDirectoryの代わりにイメージファイルを含むディレクトリ、または親の現在のディレクトリから検索を開始するように見えます。私もあなたが示唆したようにSetDllDirectoryを試しましたが、何の効果もありませんでした。 – Hughenot

関連する問題