如果 ShellExecuteEx 返回 false,是否应该关闭句柄?:
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) then
begin
WaitForSingleObject(Info.hProcess, Infinite);
CloseHandle(Info.hProcess);
end else
begin
//should I close the process handle?
end;
end;
更一般地说,如何检查是否应该关闭句柄?
仅在以下情况下才会返回进程句柄:
- 你包括
SEE_MASK_NOCLOSEPROCESS
, and
- 函数调用成功,并且
- 通过创建新流程解决了该操作。
如果前两个条件成立,但第三个条件不成立,那么您将被处理回一个值为零的进程句柄。所以你的代码应该是:
Result := ShellExecuteEx(@Info);
if Result and (Info.hProcess<>0) then
begin
WaitForSingleObject(Info.hProcess, Infinite);
CloseHandle(Info.hProcess);
end;
如果我们非常迂腐,我们可能会寻找错误检查WaitForSingleObject
and CloseHandle
。但坦率地说,我发现在这种情况下很难对此感到兴奋。可以从哪些可能的故障模式中恢复?
你可能会问我的意思是:
通过创建新流程解决了该操作。
嗯,完全有可能通过回收现有进程来解决 shell 操作。在这种情况下,您可能不会返回进程句柄。这会让你的代码陷入困境,因为你没有什么可以等待的,更不用说没有句柄可以关闭了。你只需要接受这样的场景是你无法承受的。
该文档是这样说的:
SEE_MASK_NOCLOSEPROCESS
用于指示 hProcess 成员接收进程句柄。该句柄通常用于允许应用程序查明使用 ShellExecuteEx 创建的进程何时终止。在某些情况下,例如当通过 DDE 对话满足执行时,不会返回任何句柄。调用应用程序负责在不再需要句柄时关闭该句柄。
最后,我要祝贺您认真对待错误检查和泄漏避免问题。很多开发人员似乎都忽略了这个问题,无论他们被告知多少次。很高兴您听取了对最近问题的评论并努力改进您的代码。做得好!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)