2011-07-07 13 views
8

Necesito obtener la descripción de un código de error de la función WinInet, La documentación de MSDN sobre las funciones de WinInet dice que debo usar la función GetLastError para recuperar el último error código cuando una función falla. Ahora cuando miro la documentación sobre la función GetLastError dice.Cómo puedo recuperar la descripción del error para un código de error WinInet de delphi

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

puedo comprobar la función SysErrorMessage Delphi llama internamente a la función FormatMessage winapi, así que estoy usando esa función para recuperar la descripción del error, pero no está funcionando (me refiero no devuelve una descripción para un código de error de WinInet) Probé este código en Delphi 2007 y Delphi XE.

ver este código

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. 

cuando ejecuto el código devuelve el código 12006 que se define como ERROR_INTERNET_UNRECOGNIZED_SCHEME y la descripción asociada es The URL scheme could not be recognized or is not supported.

Así que la pregunta es How I can retrieve the error description for the WinInet error codes in delphi?

+0

una solución al problema, pero se puede usar en lugar de 'RaiseLastOSError Código: GetLastError =; aumentar Exception.Create (Formato ('Error% d Descripción% s', [Código, SysErrorMessage (Código)])); ' –

+0

@Gerry, gracias pero me trataron su sugerencia y no recuperar cualquier descripción sobre el error. – Salvador

Respuesta

10

Creo que se debe tratar de utilizar FormatMessage directamente, porque hay que decir de donde se origina el código de error. Encontré este código de trabajo.

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; 

Debe realizar algunos cambios, probablemente use 'wininet.dll' en lugar de Advapi32.dll, pero debería funcionar.

ACTUALIZACIÓN

Esta es la versión para las funciones de 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; 
No
+0

Muchas gracias este trabajo perfecto. – Salvador

+0

@ErvinS, actualicé su respuesta agregando la función que uso, para ayudar a otros usuarios con el mismo problema. :) y 1 para su respuesta es – RRUZ

+0

Ejemplo de uso está presente en Soap.SOAPHTTPTrans.pas en procedimiento THTTPReqResp.RaiseCheck (ErrCode: DWORD; ShowSOAPAction: Boolean); y Datasnap.Win.SConnect en el procedimiento TWebConnection.Check (Error: Boolean); –

-3

Para mí la de error se ve bien - no sé cualquier esquema de URL llamado "foo" :)

Intente algo l ike "http://foo.bar" como URL para ver ¿recibe otro mensaje de error?

+0

el problema no es el error. el problema es que no puedo recuperar la descripción del error. – Salvador

Cuestiones relacionadas