Проблема с API GetLastError в Windows 7
-
21-09-2019 - |
Вопрос
У меня есть одно приложение, которое взаимодействует с сервером.Если сервер не работает, я получу 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.