gpt4 book ai didi

delphi - 可以安全地假设 InternetCloseHandle() 不会失败,从而允许更清晰的代码吗?

转载 作者:行者123 更新时间:2023-12-03 15:24:19 25 4
gpt4 key购买 nike

下面是使用 WinINet 执行 HTTP 请求并返回获取的字符串或引发异常的例程:

function Request(const pConnection: HINTERNET; const localpath: string): string;
var Buffer: packed Array[1..5000] of Char; BytesRead: Cardinal; pRequest: HINTERNET; sent: boolean;
begin
Result := '';
pRequest := HTTPOpenRequest(pConnection, 'GET', pchar(localpath), nil, nil, nil, 0, 0);
if pRequest <> nil then
begin
sent := HTTPSendRequest(pRequest, nil, 0, nil, 0);
if sent then
while InternetReadFile(pRequest, @Buffer, SizeOf(Buffer)-1 {leave room for terminator}, BytesRead) do
begin
Buffer[BytesRead+1] := #0;
Result := Result + buffer;
end;
InternetCloseHandle(pRequest);
if not sent then RaiseLastOSerror; // HTTPSendRequest failed
end
else RaiseLastOSerror; // HTTPOpenRequest failed
end;

如果即使已成功分配 pRequest,InternetCloseHandle(pRequest) 也可能失败,则 GetLastError() 将为 InternetCloseHandle() 而不是 HTTPSendRequest() 返回错误代码。修复这个问题需要如下代码:

function Request(const pConnection: HINTERNET; const localpath: string): string;
var Buffer: packed Array[1..5000] of Char; BytesRead: Cardinal; pRequest: HINTERNET;
begin
Result := '';
pRequest := HTTPOpenRequest(pConnection, 'GET', pchar(localpath), nil, nil, nil, 0, 0);
if pRequest <> nil then
begin
if HTTPSendRequest(pRequest, nil, 0, nil, 0) then
while InternetReadFile(pRequest, @Buffer, SizeOf(Buffer)-1 {leave room for terminator}, BytesRead) do
begin
Buffer[BytesRead+1] := #0;
Result := Result + buffer;
end
else
begin
InternetCloseHandle(pRequest);
RaiseLastOSerror; // HTTPSendRequest failed
end;
InternetCloseHandle(pRequest);
end
else RaiseLastOSerror; // HTTPOpenRequest failed
end;

但乍一看,这似乎更丑陋、更令人困惑。

可以安全地假设 InternetCloseHandle() 不会失败,从而允许更简单的代码吗?

最佳答案

首先,这种代码没有帮助:

raise Exception.Create(IntToStr(GetLastError))

改用这个:

RaiseLastOsError; // This raises an exception with the description of the error

既然您在代码中使用了异常,那么如何调用这样的函数,以便在无法关闭句柄时引发异常?

Win32Check(InternetCloseHandle(H))

关于delphi - 可以安全地假设 InternetCloseHandle() 不会失败,从而允许更清晰的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6583733/

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