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

¿Fue útil?

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. 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top