Вопрос

У меня есть одно приложение, которое взаимодействует с сервером.Если сервер не работает, я получу ERROR_WINHTTP_CANNOT_CONNECT Я использую getLastError() API для получения этого кода ошибки. Я обрабатываю этот код ошибки, чтобы отображать пользователям правильные сообщения об ошибках.Эта программа отлично работает в Windows 2003.Когда я пробовал использовать Windows7, я не получаю никаких ошибок, getLastError() API возвращает 0 каждый раз, даже если произошла ошибка.Что касается языка программирования, я использую C++.

Заранее спасибо

Санту

Это было полезно?

Решение 2

Я наблюдал разное поведение GetLastError API в Windows 2003 и Windows 7.Ниже приведены подробности моего наблюдения

В виндовс 2003:

Пример кода:

WinHttpOpen () - Завершается успешно

Winhttpconnect() – Этот API не работает по каким-то причинам, например, код ошибки 12029.

GetLastErrorCode() – Возвращает код ошибки 12029, как и ожидалось.

WinHttpCloseHandle(hOpen);- Закрытие дескриптора HttpOpen завершается успешно.

GetLastErrorCode() – Возвращает код ошибки 12029.

В Windows 7

Пример кода:

WinHttpOpen () - Завершается успешно

Winhttpconnect() – Этот API не работает по каким-то причинам, например, код ошибки 12029.

GetLastErrorCode() – Возвращает код ошибки 12029, как и ожидалось.

WinHttpCloseHandle(hOpen); - Закрытие дескриптора HttpOpen завершается успешно.

GetLastErrorCode() – Возвращает код ошибки 0 // см. разницу с примером Windows 2003: в Windows 2003 этот API возвращает последнюю ошибку 1209

Другие советы

Если вы выполняете какие-либо вызовы Windows API между сбоем и моментом вызова GetLastError(), код ошибки может сброситься до 0, когда этот вызов API завершится успешно.

Вам нужно вызвать GetLastError() сразу после сбоя и сохранить это значение, а не пытаться ждать и вызывать GetLastError() позже.

Ответ от Microsoft на такое поведение

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. 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top