我需要获取WinInet函数错误代码的描述,关于WinInet函数的MSDN文档说明当函数失败时我必须使用
GetLastError
函数来检索最后一个错误代码.现在,当我查看有关
GetLastError
功能的文档说.
.To obtain an error string for system
error codes,use the
07002 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,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),INTERNET_FLAG_RELOAD,0);
- if hRemoteUrl=nil then
- begin
- Code:=GetLastError;
- raise Exception.Create(Format('Error %d Description %s',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方案.
解决方法
我认为你应该尝试直接使用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,Buffer,SizeOf(Buffer),nil);
- while (Len > 0) and (Buffer[Len - 1] in [#0..#32,'.']) do Dec(Len);
- SetString(Result,Len);
- end;
您应该进行一些更改,可能使用’wininet.dll’而不是Advapi32.dll,但它应该可以工作.
UPDATE
这是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,@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,Len);
- finally
- LocalFree(HLOCAL(Buffer));
- end;
- end;