gpt4 book ai didi

delphi - 如何检查句柄是否应该关闭?

转载 作者:行者123 更新时间:2023-12-03 14:52:02 26 4
gpt4 key购买 nike

如果 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;

更一般地说,如何检查是否应关闭句柄?

最佳答案

只有在以下情况下才会返回进程句柄:

  1. 您添加了SEE_MASK_NOCLOSEPROCESS,并且
  2. 函数调用成功,并且
  3. 该操作已通过创建新流程得到解决。

如果前两个条件成立,但第三个条件不成立,那么您将被处理回一个值为零的进程句柄。所以你的代码应该是:

Result := ShellExecuteEx(@Info);
if Result and (Info.hProcess<>0) then
begin
WaitForSingleObject(Info.hProcess, Infinite);
CloseHandle(Info.hProcess);
end;

如果我们非常迂腐,我们可能会在 WaitForSingleObjectCloseHandle 上寻找错误检查。但坦率地说,我发现在这种情况下很难对此感到兴奋。可以从哪些可能的故障模式中恢复?

<小时/>

你可能会问我的意思:

The action was resolved by creating a new process.

嗯,shell 操作完全有可能通过回收现有进程来解决。在这种情况下,您可能不会返回进程句柄。这会让你的代码陷入困境,因为你没有什么可以等待的,更不用说没有句柄可以关闭了。您只需要接受这样的情况是您无法承受的。

文档中有这样的说法:

SEE_MASK_NOCLOSEPROCESS

Use to indicate that the hProcess member receives the process handle. This handle is typically used to allow an application to find out when a process created with ShellExecuteEx terminates. In some cases, such as when execution is satisfied through a DDE conversation, no handle will be returned. The calling application is responsible for closing the handle when it is no longer needed.

<小时/>

最后,我要祝贺您认真对待错误检查和避免泄漏的问题。很多开发人员似乎都忽略了这个问题,无论他们被告知多少次。很高兴您听取了对最近问题的评论并努力改进您的代码。干得好!

关于delphi - 如何检查句柄是否应该关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39393696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com