こんばんは。
先程、外部プログラムのフォームを最表面・・・について
質問していました「やまたか」です。
まだ、解決していないんですが、
もうひとつ、疑問点が発生しました。
先程の外部呼び出しコードを実行すると、
外部プログラムが表示されるまでに
約30秒程度かかります。
どこかに設定できるパラメーターがあるような気がするのですが
ネットで色々しらべましたが、わかりませんでした。
教えていただけませんでしょうか。
procedure TfrmMenu.btnEnterClick(Sender: TObject);
const
exeName = 'C:\EXE\\Auth.exe';
var
SI : TStartupInfo;
PI : TProcessInformation;
command : String;
CSVFILE : TextFile;
s : String;
SQL1, SQL2, SQL4 : String;
flg : Integer;
begin
//Exe呼び出し
command := exeName;
GetStartupInfo(SI);
if Not CreateProcess(pchar(command), nil, nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI) then
Raise Exception.Create('Exec Error' + IntToStr(GetLastError));
//戻りを待つ
try
Enabled := False;
while WaitForSingleObject(PI.hProcess, 0) = WAIT_TIMEOUT do
Application.ProcessMessages;
finally
Enabled := True;
end;
//ハンドルをクローズ
CloseHandle(PI.hProcess);
CreateProcessじゃなくて、ShellExecuteで起動してはだめなのでしょうか?
Answerさん、ご回答ありがとうございます。
ご指摘いただいた「ShellExecute」でコーディングしましたが、
動作は変りませんでした。
また、説明不足でしたが以下の環境で開発しています。
Windows7 Pro
Delphi 2010
例えば、
exeName = 'C:\EXE\\Auth.exe';
を
exeName = 'calc.exe';
に変えると動作はどうなるでしょうか?
deldelさん、お返事ありがとうございます。
ご指示いただいた通り
exeName = 'calc.exe';で試してみました。
実行しましたら、「Exec Error2」のメッセージがでました。
そのメッセージがでるまでの時間は以前と同様でした。
外部プログラム側は単体起動した際は問題ないのですよね?
提示されているコードをそのままコピー・ペーストして、実行ファイルのパス
だけ別のものに書き換えて実行してみましたが、すんなり稼働しました。
何か別の要因が邪魔したりしていませんか?
シンプルな構成で実行した場合も同じ結果になりますか?
Answerさん、あさん、お返事ありがとうございます。
>外部プログラム側は単体起動した際は問題ないのですよね?
単体起動時間は問題ございません。
>何か別の要因が邪魔したりしていませんか?
調べてみます。
以下のように、待つ処理を分けてみたらどうなるでしょうか?
{ Private 宣言 }
PI : TProcessInformation;
・・・・・
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
Timer1.Interval := 100;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
exeName = 'C:\EXE\\Auth.exe';
var
SI: TStartupInfo;
begin
GetStartupInfo(SI);
if CreateProcess(PChar(exeName), nil, nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI) then begin
Timer1.Enabled := True;
end else begin
ShowMessage(SysErrorMessage(GetLastError));
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
while WaitForSingleObject(PI.hProcess, 0) = WAIT_TIMEOUT do
Application.ProcessMessages;
CloseHandle(PI.hProcess);
showmessage('Auth.exe 終了');
end;
ツイート | ![]() |