【发布时间】:2015-05-09 15:13:43
【问题描述】:
场景: 从 App1,我需要执行 App2,将 App1.Handle 作为参数传递。 App2 应该等到 App1 关闭。此后,App2 应将 App1.exe 文件替换为更新版本。
- 有没有更好的方法来更新正在运行的可执行文件?
- 如果没有.. 在 App2 中,我知道 App1.Handle,我应该检查一下 如果 App1 已关闭。如何验证从 App1.Handle?
编辑:
应用1:
var
ProcessHandle : THandle;
begin
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId());
//Is PROCESS_ALL_ACCESS needed?
ShellExecute(0, 'open', 'App2.exe', PChar(IntToStr(ProcessHandle)), '.\', SW_SHOW);
end;
应用程序2:
var
SenderHandle : THandle;
begin
if(ParamStr(1) <> '') then
begin
SenderHandle := StrToInt(ParamStr(1));
WaitForSingleObject(SenderHandle, INFINITE);
ShowMessage('App1 Terminated!');
//Showmessage is executed when App1 is still running, what's wrong?
end;
end;
【问题讨论】:
-
句柄应该是可继承的,阅读OpenProcess的文档。此外,您应该相应地使用 CreateProcess(处理继承 - 请参阅文档)而不是 ShellExecute。您不需要所有访问权限,同步就足够了。你应该检查 API 的返回,然后你就会知道你的等待函数正在返回 WAIT_FAILED。
-
@SertacAkyuz:我按照建议做了,效果很好!感谢您的评论!
-
干得好,诚然我的评论不是很冗长。不客气!
标签: delphi executable handle auto-update