这是我的函数,应该执行一个程序为" modal"。
function EditAndWait(const AFileName : string) : boolean;
var
Info: TShellExecuteInfo;
begin
FillChar(Info, SizeOf(Info), 0);
Info.cbSize := SizeOf(Info);
Info.lpVerb := 'edit';
Info.lpFile := PAnsiChar(AFileName);
Info.nShow := SW_SHOW;
Info.fMask := SEE_MASK_NOCLOSEPROCESS;
Result := ShellExecuteEx(@Info);
if(Result) and (Info.hProcess <> 0) then
begin
WaitForSingleObject(Info.hProcess, Infinite);
CloseHandle(Info.hProcess);
end;
end;
受到我last question答案的启发,我正考虑改变这个功能。 特别是,在某些情况下,ShellExecuteEx似乎没有返回句柄。
如果出现以下情况,您只会返回一个流程句柄:
- 您加入了
SEE_MASK_NOCLOSEPROCESS
和- 函数调用成功,
- 通过创建新流程解决了该问题。
醇>...
通过创建新流程解决了该问题。
嗯,完全有可能通过解决shell动作 重新循环现有流程。在这种情况下,您可能不会被退回 进程句柄。这会因为你而对你的代码产生影响 没有什么可以等待,没关系没有关闭的句柄。你只是 必须接受这种情况超出你的范围。
我想知道是否有办法确保我的申请被阻止&#34;直到另一个程序关闭。
答案 0 :(得分:-1)
您可以尝试使用DisableTaskWindows()和EnableTaskWindows()锁定应用程序主窗体;
var
Windowslist : pointer;
WindowsList := DisableTaskWindows(0);
try
// Do something ...
finally
EnableTaskWindows(WindowsList);
end;