2

OK - これは非常に風変わりなシナリオであり、その真相を突き止めるのに苦労しています。

2 つのアプリケーション (app1 と app2 としましょう) とテキスト ファイル (txt1) があります。
App1 と txt1 は同じディレクトリ (たとえば C:\APP) にありますが、app2 は app1 のディレクトリのサブディレクトリ (C:\APP\SUB) にあります。

App1 が起動すると、標準を使用して txt1 からいくつかのものを読み取ります。

AssignFile(txtFile,'txt1.txt');
Reset(txtFile);

問題ありません。ただし、App2 が shellexecute コマンドを介して App1 を起動すると、次のようになります。

shellexecute(0,'open','..\app1.exe',nil,nil,SW_SHOW);

App1 はテキスト ファイルを認識できないようです。「指定されたファイルが見つかりませんでした」という応答が返されます。奇数。

以下を追加してデバッグしました:

if not fileexists('txt1.txt') then
showMessage(ExtractFilePath(application.exename));

そして、これは app1 (それ自体) の正しいファイル パスを示しています。shellexecuteを使用すると、アプリケーションが実際のディレクトリではなく、サブディレクトリから実行されていると何らかの形で認識されるのでしょうか?

最も簡単な解決策は、「app1」が開いているすべてのファイルの先頭にファイルパスを追加することであることを理解しています(試してみましたが、正しく動作します)が、実際には、このメインのファイルが何百もありますアプリケーションは、同様の方法 (txt、ini、または dll) を介してアクセスします。つまり、ファイルがアプリケーションと同じディレクトリにあるという事実に基づいてファイルを割り当てるため、完全修飾ファイル パスを設定せず、それらを変更 (および維持) します。現時点では、すべてを行うことに関心があるわけではありません。

誰もこれまでにこのようなものを見たことがありますか? ShellExecute 以外に App2 が App1 を起動するより良い方法はありますか? App1 に渡されるパラメーターや何もありません。起動する必要があるだけです。

お時間をいただきありがとうございます。これについて他に何か必要なことがあればお知らせください。

4

2 に答える 2

5

デフォルトでは、新しいプロセスは親プロセスの作業ディレクトリを継承します。もちろん、このデフォルトを使用する必要はありませんが、コードで使用します。また、相対パスは作業ディレクトリからの相対パスです。そのため、2 番目のプロセスは最初のプロセスの作業ディレクトリを継承し、間違った場所でファイルを探します。

根本的な問題は、プログラムが作業ディレクトリの値に依存していることです。しかし、テキスト ファイルは作業ディレクトリにありません。関連する実行可能ファイルと同じディレクトリにあります。これら 2 つのディレクトリがたまたま一致したときは、幸運でした。

したがって、相対パスの使用をやめ、実行可能ファイルのパスを使用して構築された完全な絶対パスの使用を開始する必要があります。

FileName := ExtractFilePath(ParamStr(0)) + 'txt1.txt';

ShellExecute を呼び出す方法にも同じ問題があります。ここでも、作業ディレクトリに依存しています。使用する必要がある実行可能ファイル名は次のとおりです。

ExtractFilePath(ParamStr(0)) + '..\app1.exe'

新しいプロセスを作成するときに作業ディレクトリを指定することを提案する回答を受け入れましたが、それは間違った解決策です。このファイルは実行可能ファイルと同じディレクトリにあるため、そのように見つける必要があります。

コードが作業ディレクトリに依存する方法は、呼び出しプロセスに不必要で骨の折れる要件を課します。つまり、実行可能ファイルのディレクトリと同じ作業ディレクトリを指定します。特に、そうする必要がないため、発信者にそれを要求するべきではありません。

また、GUI プログラムの場合、実行中に作業ディレクトリが変更される可能性があることに注意してください。たとえば、ファイル ダイアログを使用する場合などです。コンソール アプリケーションの場合、作業ディレクトリは入力パラメーターと見なすことができます。GUI プログラムの場合、これは当てはまりません。

于 2013-08-13T18:44:37.993 に答える