Ошибка WinHttpConnect, GetLastError возвращает 6

Любые предположения относительно того, почему этот простой тестовый код показывает сбой WinHttpConnect с кодом ошибки 6 (неверный дескриптор или ERROR_INVALID_HANDLE):

   HINTERNET internet = WinHttpOpen(L"test",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0);
   assert(internet == (HINTERNET)1);
   HINTERNET connect = WinHttpConnect(internet,L"www.microsoft.com",INTERNET_DEFAULT_HTTP_PORT,0);
   assert(!connect);
   DWORD err = GetLastError();
   assert(err == 6);

Все вышеперечисленные утверждения проходят. Я запускал этот код на своем ПК с Win8, а также на сервере Win2003. Два разных ПК, одна и та же проблема. Мой первоначальный код был более сложным и работал как сервис, но я сократил его до этого кода и просто запустил в простом тестовом приложении в пользовательском режиме (не в сервисе).

Мое приложение скомпилировано с помощью более старого компилятора Borland Builder 6, но не уверен, что это должно быть проблемой.


person eselk    schedule 12.08.2014    source источник
comment
WinHttpOpen() не гарантирует возврат 1 в случае успеха. Вместо этого вы должны утверждать != 0, как вы делаете с WinHttpConnect(). Кроме того, GetLastError() имеет смысл только тогда, когда любая из функций возвращает 0, поэтому не вызывайте его, если они на самом деле не терпят неудачу.   -  person Remy Lebeau    schedule 13.08.2014
comment
Верно, но я хотел, чтобы вопрос был как можно более подробным, чтобы показать, что в моем случае он всегда возвращает 1. Выглядело немного странно и, возможно, ключ к проблеме, поскольку большинство дескрипторов имеют большие значения.   -  person eselk    schedule 24.08.2014


Ответы (1)


Я уже набрал свой вопрос, а затем понял это незадолго до того, как опубликовал его. Вместо того, чтобы удалять или не публиковать свой вопрос, я решил, что должен поделиться им, потому что знаю, что другие все еще застряли, используя этот действительно старый компилятор: (

C++ Borland Builder 6 не включает файл WinHTTP.LIB, поэтому я использовал implib для его создания, как всегда. Что ж, в этом случае вам нужно использовать флаг -f, чтобы заставить его импортировать по имени, а не по порядковому номеру, иначе вы получите странные результаты.

implib -f winhttp.lib winhttp.dll

В любом случае это сработало для меня, и теперь мой приведенный выше код работает на сервере Win2003, а также на ПК с Win8.

Извините, я не уверен, где я взял файл WinHTTP.h, вероятно, из более новой версии компилятора Borland/Inspire, поскольку файлы Microsoft SDK обычно не работают.

person eselk    schedule 12.08.2014
comment
Это будет означать, что экспортируемый порядковый номер WinHttpConnect() изменился между версиями Windows (что не было чем-то неслыханным на протяжении многих лет), и почему импорт его по имени решает эту проблему. Вы всегда должны импортировать по имени, когда это возможно. - person Remy Lebeau; 13.08.2014