Проблема с API GetLastError в Windows 7 - PullRequest
0 голосов
/ 17 февраля 2010

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

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

Santhu

Ответы [ 3 ]

0 голосов
/ 18 февраля 2010

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

В Windows 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

0 голосов
/ 04 марта 2010

Ответ от 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. 
0 голосов
/ 17 февраля 2010

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

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

...