Problema com API GetLasterror no Windows 7
-
21-09-2019 - |
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
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.