Problema con GetLastError API en Windows 7
-
21-09-2019 - |
Pregunta
Tengo una aplicación que interactúa con el servidor. Si el servidor no funciona entonces a continuación, voy a entrar ERROR_WINHTTP_CANNOT_CONNECT
estoy usando API getLastError()
para obtener este código de error, yo estoy manejando este código de error para mostrar mensajes de error apropiados a los usuarios. Este programa funciona bien en Windows 2003. Cuando he intentado con Windows 7 no estoy recibiendo ningún error, la API devuelve 0 getLastError()
cada vez que incluso si se ha producido un error. Estoy usando C ++ como lenguaje de programación se refiere.
Gracias por adelantado
santhu
Solución 2
He observado un comportamiento diferente del API GetLastError en Windows 2003 y en Windows 7. A continuación se presentan más detalles de observación
En Windows 2003:
Ejemplo de código:
WinHttpOpen ()
- completa con éxito
Winhttpconnect()
- Esta API se falló debido a algunas razones, por ejemplo el código de error 12029
GetLastErrorCode()
- Devuelve el código de error 12029 como se esperaba
WinHttpCloseHandle(hOpen)
; - manija de cierre de HttpOpen, completa successfilly
GetLastErrorCode()
- Devuelve el código de error 12029
En Windows 7
Ejemplo de código:
WinHttpOpen ()
- completa con éxito
Winhttpconnect()
- Esta API se falló debido a algunas razones, por ejemplo el código de error 12029
GetLastErrorCode()
- Devuelve el código de error 12029 como se esperaba
WinHttpCloseHandle(hOpen);
- Cierre de asa para HttpOpen, completa con éxito
GetLastErrorCode()
- Devuelve el código de error 0 // ver la diferencia con el ejemplo, Windows 2003, Windows 2003 esta API devuelve último error que es 1209
Otros consejos
Si realiza llamadas a la API de Windows entre el fracaso y el tiempo de llamar a GetLastError (), el código de error puede reconfiguradas a 0 cuando esa llamada a la API tiene éxito.
Es necesario llamar a GetLastError () inmediatamente después del fracaso, y guardar ese valor en lugar de tratar de esperar y llamar a GetLastError () más tarde.
Respuesta desde Microsoft en este comportamiento
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.