2017-09-08 28 views
0

私はたくさんの検索をしましたが、私は正しい答えを見つけられません。Delphi7から.batファイル(RandomApp.exeを開くなど)を正しく開く方法は?

ディレクトリ:

  • プロジェクト(このフォルダには、Delphiコードと "RunThis"

    • RunThis

      • RandomApp.exe
      • 実行というフォルダが含まれています。バット
      • CONFIG.TXT

run.batをコード

start %cd%\RandomApp.exe 
pause 

デルファイ7(ボタンのクリックでこのコードを実行します。)

ShellExecute (application.handle, 'open', 'cmd', PChar('cmd.exe /c RunThis\Run.bat'), nil, SW_MAXIMIZE 

もしIディレクトリに 'cmd.exe/c'部分を追加しないと、Delphiは自分のコードを一切使わずにcmdを開きます。私が 'cmd.exe/c'を追加すると、cmd.exeを実行しなければならないのと同じように、それはRun.batを正しく開きます。

Windowsでこのエラーが表示される: Windowsでは「C:\ Project \ RunThis \ RandomApp.exe」が見つかりません。正しく名前を入力してから、もう一度やり直してください。

これについて面白いのは、私がRun.batをダブルクリックするだけで、それは完璧に実行されるということです。しかし、Delphiで開くと、このエラーが表示されます。 Run.batの現在のアドレスに問題があったと思った。だからではなく、というのが:

start %cd%\RandomApp.exe  

ちょうど、追加する私はデルファイ7を得たときだけのようなプログラムを直接開く:

ShellExecute(Handle, 'open', PChar('RunThis\RandomApp.exe'),null, null, SW_SHOWNORMAL) ; 
start RandomApp.exe 

は私ではなく、完全なカレントディレクトリを使用

"Config.txt"が見つかりませんでした。 RandomApp.exeはすべての設定を保存するテキストファイルを使用します。

また、Run.batまたはRandomApp.exeをクリックするだけで、両方が完全に実行されます。問題は、コードで開くときです。私はそれがディレクトリと関係があると感じているが、よく分からない。

ありがとうございました。

PS:実行中のWindows 10.

+1

なぜあなたはプロセスを作成するためのスクリプトを実行するために、CMDプロセスを作成するためにシェルを求めるだろう。なぜプロセスを作成しないのですか? 4ステップを1に変えてください。 –

+0

@DavidHeffernanお返事ありがとうございました。希望のアドバイスへのガイダンスやリンクが含まれていると、あなたの答えがはるかに役立つことに注意してください。あなたができるなら、そのようなことを私に助けてください?ありがとうございました。 – user3215933

+0

CreateProcessを呼び出し、実行可能ファイルへのパスを渡します。 –

答えて

5

絶対パスは絶対に使用しないでください。

RandomApp.exeは、相対パスを使用してConfig.txtを検索する可能性がありますが、アプリケーションから実行すると、現在の作業ディレクトリはプロジェクトフォルダであり、RunThisフォルダではありません。そのため、RandomApp.exeはファイルを見つけることができません。だから、例えば、ShellExecute()に正しいフォルダを渡す:

var 
    Folder: string; 
begin 
    Folder := ExtractFilePath(Application.ExeName)+'RunThis\' ; 
    ShellExecute(Application.Handle, nil, PChar(Folder+'Run.bat'), nil, PChar(Folder), SW_MAXIMIZE); 
end; 
+0

これはDelphi 7で完全に機能します。最初のパラメータ(HWND)は「0」にすることができ、最後のパラメータを試してみることにします。その他のオプションには 'SW_SHOWNORMAL'と' SW_SHOWMINIMIZED'があります。 – AlainD

+2

@AlainD HWND *は0にすることはできますが、使用可能な場合は0にする必要はありません。実際、ボタンがクリックされているので、アプリケーションの代わりにフォームのHWNDを使用します。 –

+1

実際には、ShellExecuteを呼び出す必要はありません。所有者ウィンドウはなく、CreateProcessを呼び出すだけです。 –

関連する問題