gpt4 book ai didi

delphi - 我如何从delphi检索WinInet错误代码的错误描述

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

我需要获取 WinInet 函数错误代码的描述,有关 WinInet 函数的 MSDN 文档说明我必须使用 GetLastError函数在函数失败时检索最后一个错误代码。现在,当我检查有关 GetLastError 的文档时函数说。

.To obtain an error string for system error codes, use the FormatMessage function

我检查了哪个SysErrorMessage delphi函数内部调用FormatMessage winapi 函数,所以我使用该函数来检索错误描述,但不起作用(我的意思是不返回 WinInet 错误代码的描述)我在 Delphi 2007 和 Delphi XE 中测试了此代码。

查看此代码

uses
Wininet, Windows, SysUtils;


procedure TestWinInet(const AUrl : string);
var
hInter,hRemoteUrl : HINTERNET;
Code : Cardinal;
begin

hInter := InternetOpen(PChar('Explorer 5.0'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if hInter=nil then
begin
Code:=GetLastError;
raise Exception.Create(Format('Error %d Description %s',[Code,SysErrorMessage(Code)]));
end;

try
hRemoteUrl := InternetOpenUrl(hInter, PChar(AUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);
if hRemoteUrl=nil then
begin
Code:=GetLastError;
raise Exception.Create(Format('Error %d Description %s',[Code,SysErrorMessage(Code)]));
end;

try
//do something else


finally
InternetCloseHandle(hRemoteUrl);
end;
finally
InternetCloseHandle(hInter);
end;
end;

begin
try
//i am passing a invalid url just to raise the error
TestWinInet('Foo');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

当我执行此代码时,返回代码 12006,其定义为 ERROR_INTERNET_UNRECOGNIZED_SCHEME相关描述为无法识别或不支持 URL 方案。

所以问题是如何在delphi中检索WinInet错误代码的错误描述?

最佳答案

我认为你应该尝试直接使用FormatMessage,因为你需要知道错误代码的来源。我找到了这个工作代码。

class function TCertificateManager.GetLastErrorText: string;
var
code: DWORD;
Len: Integer;
Buffer: array[0..255] of Char;
begin
code := GetLastError();
Len := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_FROM_SYSTEM,
Pointer(GetModuleHandle('Advapi32.dll')), code, 0, Buffer, SizeOf(Buffer), nil);
while (Len > 0) and (Buffer[Len - 1] in [#0..#32, '.']) do Dec(Len);
SetString(Result, Buffer, Len);
end;

您应该进行一些更改,可能使用“wininet.dll”而不是 Advapi32.dll,但它应该可以工作。

更新

这是 WinInet 函数的版本

function GetWinInetError(ErrorCode:Cardinal): string;
const
winetdll = 'wininet.dll';
var
Len: Integer;
Buffer: PChar;
begin
Len := FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_FROM_SYSTEM or
FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_IGNORE_INSERTS or FORMAT_MESSAGE_ARGUMENT_ARRAY,
Pointer(GetModuleHandle(winetdll)), ErrorCode, 0, @Buffer, SizeOf(Buffer), nil);
try
while (Len > 0) and {$IFDEF UNICODE}(CharInSet(Buffer[Len - 1], [#0..#32, '.'])) {$ELSE}(Buffer[Len - 1] in [#0..#32, '.']) {$ENDIF} do Dec(Len);
SetString(Result, Buffer, Len);
finally
LocalFree(HLOCAL(Buffer));
end;
end;

关于delphi - 我如何从delphi检索WinInet错误代码的错误描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605708/

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