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

前端之家收集整理的这篇文章主要介绍了我如何从delphi中检索WinInet错误代码的错误描述前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要获取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.

看到这段代码

  1. uses
  2. Wininet,Windows,SysUtils;
  3.  
  4.  
  5. procedure TestWinInet(const AUrl : string);
  6. var
  7. hInter,hRemoteUrl : HINTERNET;
  8. Code : Cardinal;
  9. begin
  10.  
  11. hInter := InternetOpen(PChar('Explorer 5.0'),INTERNET_OPEN_TYPE_PRECONFIG,nil,0);
  12. if hInter=nil then
  13. begin
  14. Code:=GetLastError;
  15. raise Exception.Create(Format('Error %d Description %s',[Code,SysErrorMessage(Code)]));
  16. end;
  17.  
  18. try
  19. hRemoteUrl := InternetOpenUrl(hInter,PChar(AUrl),INTERNET_FLAG_RELOAD,0);
  20. if hRemoteUrl=nil then
  21. begin
  22. Code:=GetLastError;
  23. raise Exception.Create(Format('Error %d Description %s',SysErrorMessage(Code)]));
  24. end;
  25.  
  26. try
  27. //do something else
  28.  
  29.  
  30. finally
  31. InternetCloseHandle(hRemoteUrl);
  32. end;
  33. finally
  34. InternetCloseHandle(hInter);
  35. end;
  36. end;
  37.  
  38. begin
  39. try
  40. //i am passing a invalid url just to raise the error
  41. TestWinInet('Foo');
  42. except
  43. on E: Exception do
  44. Writeln(E.ClassName,': ',E.Message);
  45. end;
  46. end.

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

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

解决方法

我认为你应该尝试直接使用FormatMessage,因为你需要告诉错误代码的来源.我找到了这个有效的代码.
  1. class function TCertificateManager.GetLastErrorText: string;
  2. var
  3. code: DWORD;
  4. Len: Integer;
  5. Buffer: array[0..255] of Char;
  6. begin
  7. code := GetLastError();
  8. Len := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_FROM_SYSTEM,Pointer(GetModuleHandle('Advapi32.dll')),code,Buffer,SizeOf(Buffer),nil);
  9. while (Len > 0) and (Buffer[Len - 1] in [#0..#32,'.']) do Dec(Len);
  10. SetString(Result,Len);
  11. end;

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

UPDATE

这是WinInet函数的版本

  1. function GetWinInetError(ErrorCode:Cardinal): string;
  2. const
  3. winetdll = 'wininet.dll';
  4. var
  5. Len: Integer;
  6. Buffer: PChar;
  7. begin
  8. Len := FormatMessage(
  9. FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_FROM_SYSTEM or
  10. FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_IGNORE_INSERTS or FORMAT_MESSAGE_ARGUMENT_ARRAY,Pointer(GetModuleHandle(winetdll)),ErrorCode,@Buffer,nil);
  11. try
  12. while (Len > 0) and {$IFDEF UNICODE}(CharInSet(Buffer[Len - 1],[#0..#32,'.'])) {$ELSE}(Buffer[Len - 1] in [#0..#32,'.']) {$ENDIF} do Dec(Len);
  13. SetString(Result,Len);
  14. finally
  15. LocalFree(HLOCAL(Buffer));
  16. end;
  17. end;

猜你在找的Delphi相关文章