起動時間


やまたか  2013-08-28 03:54:25  No: 45158

こんばんは。
先程、外部プログラムのフォームを最表面・・・について
質問していました「やまたか」です。
まだ、解決していないんですが、
もうひとつ、疑問点が発生しました。
先程の外部呼び出しコードを実行すると、
外部プログラムが表示されるまでに
約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);


Answer  2013-08-28 07:08:37  No: 45159

CreateProcessじゃなくて、ShellExecuteで起動してはだめなのでしょうか?


やまたか  2013-08-28 23:53:40  No: 45160

Answerさん、ご回答ありがとうございます。
ご指摘いただいた「ShellExecute」でコーディングしましたが、
動作は変りませんでした。

また、説明不足でしたが以下の環境で開発しています。
Windows7 Pro
Delphi 2010


deldel  2013-08-29 01:49:56  No: 45161

例えば、
exeName  = 'C:\EXE\\Auth.exe';

exeName  = 'calc.exe';
に変えると動作はどうなるでしょうか?


やまたか  2013-08-29 04:01:08  No: 45162

deldelさん、お返事ありがとうございます。
ご指示いただいた通り
exeName  = 'calc.exe';で試してみました。

実行しましたら、「Exec Error2」のメッセージがでました。
そのメッセージがでるまでの時間は以前と同様でした。


Answer  2013-08-29 06:30:36  No: 45163

外部プログラム側は単体起動した際は問題ないのですよね?


  2013-08-29 06:56:42  No: 45164

提示されているコードをそのままコピー・ペーストして、実行ファイルのパス
だけ別のものに書き換えて実行してみましたが、すんなり稼働しました。
何か別の要因が邪魔したりしていませんか?
シンプルな構成で実行した場合も同じ結果になりますか?


やまたか  2013-08-29 19:02:07  No: 45165

Answerさん、あさん、お返事ありがとうございます。
>外部プログラム側は単体起動した際は問題ないのですよね?
単体起動時間は問題ございません。

>何か別の要因が邪魔したりしていませんか?
調べてみます。


deldel  2013-08-30 18:02:27  No: 45166

以下のように、待つ処理を分けてみたらどうなるでしょうか?

    { 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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加