7

ヘルプには、Shellexec と Exec の違いに関する徹底的な説明はありません。それは

Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

に相当

Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

exeファイルを扱うときは?もちろん、exeやバッチとは別のファイルを実行したい場合はShellexecを使います。

ただし、Shellexec でも Exec でも、自分の命令を正しく動作させることができない場合があります。常に機能する唯一の解決策は、バッチ ファイルを作成し、それを shellexec で実行することです。個人的には、一時ファイルを処理する必要があり、取得した結果コードを信頼できないため、このソリューションは好きではありません。この命令を機能させる方法がわからないため、バッチファイルソリューションに戻る必要があります: (コマンドプロンプトで宛先ファイルがまだ存在しない場合、命令が失敗するというエラーが発生します命令は宛先ファイルが存在しなくても機能します)。

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema>C:\myappdir\backup\newbackup.sql'; 
//the destination folder exists, the file newbackup.sql does not exist      
Shellexec('',mysqldump,params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode);

私は Windows 7 64 ビットで作業しています。プログラム (Inno Setup インストーラー) は管理者権限で実行されます。

4

3 に答える 3

7

Inno Setup でのそのような状況では、2 つの呼び出しはほとんど同じです。ただし、セットアップが最低の特権で実行されており、昇格を必要とするプロセスを実行しようとするとShellExec()、プロンプトが表示されますが、Exec()失敗します。

この 2 つの違いは、単一のモノリシック コマンド ラインを渡す場合、実行可能ファイル以外を渡す場合、または 以外の動詞を使用する場合に現れ"open"ます。

どちらの関数でも、リダイレクト演算子 ( ) などのコマンド インタープリターによって提供されるコマンドや操作を実行することはできないことに注意してください... > ...。これらのコマンドを実行するには、 に渡す必要があり{cmd}ます。

ここにいくつかの航空コードがあります:

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema';
dumpfile : = 'C:\myappdir\backup\newbackup.sql';

command := AddQuotes(mysqldump) + ' ' + params + ' >' + AddQuotes(dumpfile);
Exec(ExpandConstant('{cmd}'), '/C ' + command, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); 
于 2012-04-30T10:03:48.127 に答える
3

CreateProcessを使用してプロセスを開始することを検討しましたか? この呼び出しは、結果のプロセスを制御するためのいくつかの追加オプションを提供し、渡されたパラメーターをより適切に処理することもできます。

于 2012-04-29T17:13:31.967 に答える
3

JEDI JVCL ライブラリを使用できる場合は、CreateProcess をカプセル化する優れたコンポーネントがあります。

http://jvcl.delphi-jedi.org/

JvCreateProcess および JvCreateProcessExtended コンポーネントを見てください。JEDI JVCL は無料のオープン ソースであり、Mozilla Public License の下でリリースされています。

于 2012-04-30T05:03:35.937 に答える