shellexecute 执行完成_在执行ShellExecute之前等待吗?

这个例程是我们的游戏引擎中的一些utils代码。它可以运行一个可执行文件并有选择地等待它退出。它将返回退出代码:

function TSvUtils.FileExecute(ahWnd: Cardinal; const aFileName, aParams, aStartDir: string; aShowCmd: Integer; aWait: Boolean): Integer;

var

Info: TShellExecuteInfo;

ExitCode: DWORD;

begin

Result := -1;

FillChar(Info, SizeOf(Info), 0);

Info.cbSize := SizeOf(TShellExecuteInfo);

with Info do begin

fMask := SEE_MASK_NOCLOSEPROCESS;

Wnd := ahWnd;

lpFile := PChar(aFileName);

lpParameters := PChar(aParams);

lpDirectory := PChar(aStartDir);

nShow := aShowCmd;

end;

if ShellExecuteEx(@Info) then

begin

if aWait then

begin

repeat

Sleep(1);

Application.ProcessMessages;

GetExitCodeProcess(Info.hProcess, ExitCode);

until (ExitCode <> STILL_ACTIVE) or Application.Terminated;

CloseHandle(Info.hProcess);

Result := ExitCode;

end;

end

end;

以下是一些可以检查进程是否存在的代码。所以......当前应用程序调用更新程序并终止。该更新程序可以检查,看是否旧的应用程序已终止和做的事情(重命名,更新,删除等):

function TSvUtils.ProcessExists(const aExeFileName: string; aBringToForgound: Boolean=False): Boolean;

var

ContinueLoop: BOOL;

FSnapshotHandle: THandle;

FProcessEntry32: TProcessEntry32;

begin

FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

FProcessEntry32.dwSize := SizeOf(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

Result := False;

while Integer(ContinueLoop) <> 0 do

begin

if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =

UpperCase(aExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =

UpperCase(aExeFileName))) then

begin

if aBringToForgound then

EnumWindows(@BringToForgroundEnumProcess, FProcessEntry32.th32ProcessID);

Result := True;

end;

ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);

end;

CloseHandle(FSnapshotHandle);

end;

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

weixin_39610785

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值