我需要获取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;