Pergunta

Eu tenho um aplicativo que interage com o servidor. Se o servidor estiver inativo, então eu ficarei ERROR_WINHTTP_CANNOT_CONNECT estou usando getLastError() API Para obter esse código de erro, estou lidando com esse código de erro para exibir mensagens de erro adequadas para os usuários. Este programa funciona bem no Windows 2003. Quando eu tentei com o Windows7, não estou recebendo nenhum erro, getLastError() A API retorna 0 todas as vezes, mesmo que ocorra o erro. Estou usando o C ++ na linguagem de programação.

Desde já, obrigado

Santhu

Foi útil?

Solução 2

Eu observei o comportamento diferente da API GetLasterror no Windows 2003 e no Windows 7. Abaixo estão meus detalhes de observação

No Windows 2003:

Código de exemplo:

WinHttpOpen () - completa com sucesso

Winhttpconnect() - Esta API falhou devido a alguns motivos, digamos o código de erro 12029

GetLastErrorCode() - Retorna o código de erro 12029 como esperado

WinHttpCloseHandle(hOpen); - Handle de fechamento para httpopen, completa o sucesso

GetLastErrorCode() - Retorna o código de erro 12029

No Windows 7

Código de exemplo:

WinHttpOpen () - completa com sucesso

Winhttpconnect() - Esta API falhou devido a alguns motivos, digamos o código de erro 12029

GetLastErrorCode() - Retorna o código de erro 12029 como esperado

WinHttpCloseHandle(hOpen); - A alça de fechamento para httpopen, completa com êxito

GetLastErrorCode() - Retorna o código de erro 0 // Veja a diferença no exemplo do Windows 2003, no Windows 2003 Esta API retorna o último erro, que é 1209

Outras dicas

Se você fizer alguma chamada de API do Windows entre a falha e o tempo que você chama getLasterRor (), o código de erro poderá ser redefinido para 0 quando a chamada da API for bem -sucedida.

Você precisa ligar para getLasterRor () imediatamente após a falha e salvar esse valor em vez de tentar esperar e ligar para getLasterRor () posteriormente.

Resposta da Microsoft neste comportamento

The rules for GetLastError are:

•   If the WinHttp API returns error (for example WinHttpIsHostInProxyBypassList, http://msdn.microsoft.com/en-us/library/ee861268(VS.85).aspx) this is the error and GetLastError should *NOT* be called.
o   If GetLastError() is called, regardless of the success or failure of the API, the returned value is unpredictable and may change between Windows versions, Service Packs, or even between runs.
•   If the WinHttp API returns BOOL (for example WinHttpSetTimeouts, http://msdn.microsoft.com/en-us/library/aa384116(VS.85).aspx), it indicates failure by returning FALSE. If the caller is interested in the detailed error, (s)he should call GetLastError(). Note that GetLastError should be called *if and only if* the API failed.
o   If GetLastError() is called when the API succeded (returned anything but FALSE), the returned value is unpredictable and may change between Windows versions, Service Packs, or even between runs. 
•   If the WinHttp API returns HINTERNET (pseudo handle) the rules are exactly the same, except failure is indicated by returning NULL. 
o   If GetLastError() is called when the API succeded (returned anything but NULL), the returned value is unpredictable and may change between Windows versions, Service Packs, or even between runs. 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top