Как я могу получить описание ошибки для кода ошибки WinInet из Delphi - PullRequest
8 голосов
/ 07 июля 2011

Мне нужно получить описание кода ошибки функции WinInet. В документации MSDN о функциях WinInet сказано, что я должен использовать функцию GetLastError, чтобы получить последний код ошибки в случае сбоя функции. Теперь, когда я проверяю документацию о функции GetLastError.

.Чтобы получить строку ошибки для системы коды ошибок, используйте FormatMessage функция

Я проверяю, какая функция delphi SysErrorMessage внутренне вызывает функцию 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, а соответствующее описание - The URL scheme could not be recognized or is not supported.

Так что вопрос How I can retrieve the error description for the WinInet error codes in delphi?

Ответы [ 2 ]

10 голосов
/ 07 июля 2011

Я думаю, что вы должны попытаться использовать 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, но это должно работать.

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, 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;
0 голосов
/ 07 июля 2011

Для меня ошибка выглядит нормально - я не знаю никакой схемы URL, называемой "foo":)

Попробуйте что-то вроде "http://foo.bar" в качестве URL-адреса, чтобы увидеть, есть ли у вас другое сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...