delphi中如何判断外部应用程序何时结束

发布于 2024-08-18 17:04:22 字数 375 浏览 1 评论 0原文

我正在使用 ShellExecute 运行外部应用程序 我如何判断外部应用程序何时结束?

这是我的代码

theProgram     :=  'MySql.exe';
itsParameters  :=  ' -u user1 -ppassword -e "create database abc"’;
rslt := ShellExecute(0, 'open',
                       pChar (theProgram),
                       pChar (itsParameters),
                       nil,
                       SW_SHOW);

I am using ShellExecute to run external application
How can i tell when the external application ends ?

Here my code

theProgram     :=  'MySql.exe';
itsParameters  :=  ' -u user1 -ppassword -e "create database abc"’;
rslt := ShellExecute(0, 'open',
                       pChar (theProgram),
                       pChar (itsParameters),
                       nil,
                       SW_SHOW);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暖树树初阳… 2024-08-25 17:04:22

尝试以下功能。 WaitForSingleObject 可以满足您的需要。

function ExecAppAndWait(const sApp, sParams: String; wShow: Word; sCurrentDirectory: String = ''): DWord;
{ Parameter wShow: SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_MAXIMIZE ...}
var
  aSI     : TStartupInfo;        // Win32 : STARTUPINFO
  aPI     : TProcessInformation; // Win32 : PROCESS_INFORMATION
  aProc   : THandle;             // Win32
  aCurrentDirectory: PChar;
  s: String;
begin
  s := sApp + ' ' + sParams;
  FillChar(aSI, SizeOf(aSI), 0);
  aSI.cb := SizeOf(aSI);
  aSI.wShowWindow := wShow;
  aSi.dwFlags := STARTF_USESHOWWINDOW;


  if sCurrentDirectory = '' then
    aCurrentDirectory := nil
  else
    aCurrentDirectory := PChar(sCurrentDirectory);

  Win32Check(CreateProcess(nil, PChar(s), nil, nil,
             False, Normal_Priority_Class, nil, aCurrentDirectory, aSI, aPI));
   // in TProcessInformation.hProcess -> Process-Handle
  aProc := aPI.hProcess;

  CloseHandle(aPI.hThread);


  if WaitForSingleObject(aProc, Infinite) <> Wait_Failed then
    GetExitCodeProcess(aProc, Result);
  // free Ressource
  CloseHandle(aProc);
end;

Try the following function. WaitForSingleObject does what you need.

function ExecAppAndWait(const sApp, sParams: String; wShow: Word; sCurrentDirectory: String = ''): DWord;
{ Parameter wShow: SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_MAXIMIZE ...}
var
  aSI     : TStartupInfo;        // Win32 : STARTUPINFO
  aPI     : TProcessInformation; // Win32 : PROCESS_INFORMATION
  aProc   : THandle;             // Win32
  aCurrentDirectory: PChar;
  s: String;
begin
  s := sApp + ' ' + sParams;
  FillChar(aSI, SizeOf(aSI), 0);
  aSI.cb := SizeOf(aSI);
  aSI.wShowWindow := wShow;
  aSi.dwFlags := STARTF_USESHOWWINDOW;


  if sCurrentDirectory = '' then
    aCurrentDirectory := nil
  else
    aCurrentDirectory := PChar(sCurrentDirectory);

  Win32Check(CreateProcess(nil, PChar(s), nil, nil,
             False, Normal_Priority_Class, nil, aCurrentDirectory, aSI, aPI));
   // in TProcessInformation.hProcess -> Process-Handle
  aProc := aPI.hProcess;

  CloseHandle(aPI.hThread);


  if WaitForSingleObject(aProc, Infinite) <> Wait_Failed then
    GetExitCodeProcess(aProc, Result);
  // free Ressource
  CloseHandle(aProc);
end;
扶醉桌前 2024-08-25 17:04:22

ShellExecute 是一个直接的 WinAPI 函数。要获取有关已执行进程的任何信息,您需要使用 ShellExecuteEx 代替。

ShellExecute is a direct WinAPI function. To obtain any information on the executed process, you need to use ShellExecuteEx instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文