WinINet InternetGetProxyInfo: ошибка 1003 ERROR_CAN_NOT_COMPLETE - PullRequest
1 голос
/ 21 октября 2011

Я пытаюсь сделать приложение совместимым с auto proxy API, предоставляемым библиотекой WinINet , чтобы локальные pac-файлы работали, и я застрял с ошибкой ERROR_CAN_NOT_COMPLETE при попытке вызвать InternetGetProxyInfo ...

Я следил за постом Эрика Лоуэнтала (dev @Microsoft, поэтому я надеюсь, что его предложение в порядке, p) в здесь и идея должна быть:

  • вызов функции InternetInitializeAutoProxyDll;
  • Вызовите InternetGetProxyInfo, чтобы получить прокси-URL для каждого заданного запрошенного URL;
  • Вызовите InternetDeInitializeAutoProxyDll в конце.

Вот как выглядит мой код:

// Start by initializing the Auto proxy stuff
BOOL ok = InternetInitializeAutoProxyDll(0, pathToTheProxyPACFile, 
                                         NULL, NULL, NULL);
// Here ok is true so I consider the initialization was a success

// [...]

// Later on, I try to get the proxy used for each requested URL like this:
LPSTR proxyURL = NULL;
DWORD proxyURLLength = 0;
BOOL ok = InternetGetProxyInfo(requestedURL,
                               requestedURLLength,
                               hostName,
                               hostNameLength,
                              &proxyURL,
                              &proxyURLLength);
// Here ok is false, the proxy url and length are left as is, 
// and a call to GetLastError() returns 1003 :s

Я не вижу, что с этим не так, и не смог найти убедительного примера в сети (а документации крайне не хватает ...).

Обратите внимание, что я попытался выделить буфер для proxyURL и установить его размер на proxyURLLength, так как в документации не ясно, как обрабатывать память, но это не работает, и я понимаю, что я должен позволить WinINet обработать его в любом случае, и используйте GlobalFree на proxyURL в случае успеха.

Я также пытался использовать InternetCrackUrlA, чтобы получить имя хоста на тот случай, если класс, который я использую для получения имени хоста по запрошенному URL, не подходит для этого API (и действительно, InternetCrackUrlA считает, что порт является частью имя хоста ...), но это тоже не помогло.

Пожалуйста, дайте мне знать о любом предложении, которое может помочь мне заставить это работать;)

PS: я использовал WinHTTP, чтобы сделать то же самое в той же части кода, и он работает правильно. PPS: я тестирую это на Windows XP с установленным IE8.

Edit ==========> Я написал другую программу, которая вызывает только эти функции, и в этом случае у меня не возникает никаких проблем, поэтому я думаю, что моя проблема не в том, как я вызываю InternetGetProxyInfo, но из состояния, в котором я нахожусь, когда я его вызываю, то есть внутри реализация приемника событий, используемого для нашего встроенного IE , если только нет проблем с моими включениями или чем-то в этом роде ..?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Убедившись, что он работает в новом проекте, я отследил причину своей проблемы, и запрос на получение информации прокси-сервера начинает давать сбой после вызова OleInitialize . Так вот, в здесь был комментарий об этом, но я не знал, о чем говорил этот парень (и Бог знает, я бы хотел, чтобы я никогда не знал), поэтому это не помогло мне тогда прочитайте это.

Короче говоря, если вы инициализируете COM с помощью OleInitialize, у вас будет поток «Однопоточная квартира», и это означает, что InternetGetProxyInfo завершится ошибкой с загадочной ошибкой ERROR_CAN_NOT_COMPLETE. Решение, которое я использовал, заключалось в том, чтобы заставить работать другой поток.

PS о подписи InternetGetProxyInfo:

  • кажется, что последние два параметра должны быть установлены в NULL и 0, как я ожидал, и GlobalFree должен быть вызван для строки, чтобы освободить ее память при необходимости.

  • имя хоста и длина имени хоста необязательны.

Спасибо за вашу помощь:)

0 голосов
/ 22 октября 2011

WinHTTP не должен быть лучшим WinINet, цитируя [MSDN] [1]:

Службы Microsoft Windows HTTP (WinHTTP) предназначены для приложений среднего уровня и серверных приложений.которые требуют доступа к клиентскому стеку HTTP.Microsoft Windows Internet (WinINet) предоставляет клиентский стек HTTP для клиентских приложений, а также доступ к протоколам передачи файлов (FTP), SOCKSv4 и Gopher.http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068(v=vs.85).aspx

Если вы действительно хотите использовать WinHTTP, вы определенно можете заставить его работать при динамической загрузке "jsproxy.dll", а затем использовать InternetGetProxyInfo из этой динамически загружаемой DLL, как описано здесь .

Для полной поддержки анализа сложных файлов PAC вам придется реализовать все (или, по крайней мере, большинство) функций автоматического обратного вызова прокси и передать массив указателей на функции InternetInitializeAutoProxyDll функция динамически загружаемой DLL.

Кроме того, обратите внимание, что вам придется обрабатывать части обработки запросов / ответов для проверки подлинности прокси (кроме «прокси-серверов домена») какWinHTTP не будет автоматически обрабатывать запрос пароля прокси-сервера 407 и выбирать лучшую схему аутентификации, как это делает WinINet. Это также довольно трудоемкая ручная работа.

Все это - значительные усилия, которые я бы выполнил.если я действительно не могу использовать WinINet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...