Что может вызвать ошибку ERROR_INTERNET_INCORRECT_HANDLE_TYPE (12018) с InternetQueryOption? - PullRequest
3 голосов
/ 11 ноября 2008

Я работаю над простой маленькой функцией для загрузки файла с веб-сайта с поддержкой SSL с использованием функций WinInet, а именно InternetOpen и InternetOpenURL. Первоначально у меня был сбой вызова InternetOpenURL с ERROR_INTERNET_INVALID_CA (12045), потому что я использовал самозаверяющий сертификат на моем тестовом сервере, и обнаружил (http://support.microsoft.com/kb/q182888/), что исправление, похоже, использовало Комбинация InternetQueryOption / InternetSetOption для передачи различных флагов опции * 1004. * Однако теперь InternetQueryOption завершается ошибкой с ответом ERROR_INTERNET_INCORRECT_HANDLE (12018) от GetLastError (). Любые идеи, почему это так? пришел непосредственно из InternetOpen, который ранее работал нормально с InternetOpenURL без SSL. Разве это не должно быть правильным дескриптором?

У меня нет фактического кода (другой компьютер), но он очень похож на следующий и не работает в InternetGetOption с ERROR_INTERNET_INCORRECT_HANDLE:

  HINTERNET hReq = InternetOpen(...)
  if (!hReq) { printf("InternetOpen Error: %d", GetLastError()); }

  DWORD dwFlags = 0;
  DWORD dwBuffLen = sizeof(dwFlags);
  BOOL ret = false;

  ret = InternetQueryOption(hReq, INTERNET_OPTION_SECURITY_FLAGS,
                            (LPVOID)&dwFlags, &dwBuffLen);
  if (!ret) { printf("InternetQueryOption Error: %d", GetLastError()); }

  dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
  ret = InternetSetOption(hReq, INTERNET_OPTION_SECURITY_FLAGS,
                          &dwFlags, sizeof (dwFlags) );
  if (!ret) { printf("InternetSetOption Error: %d", GetLastError()); }

  InternetOpenURL(hReq, ...)

Ответы [ 4 ]

1 голос
/ 08 февраля 2009

Из документов MSDN для INTERNET_OPTION_SECURITY_FLAGS:

Имейте в виду, что данные, полученные этим Способ относится к транзакции, которая имеет произошел, уровень безопасности которого не может дольше будет изменено.

На вашем дескрипторе еще не было транзакции. InternetOpen дает вам корневой дескриптор HINTERNET. Это может применяться к соединениям HTTP, FTP или Gopher - тогда как параметры безопасности довольно специфичны для HTTPS и в значительной степени зависят от того, что поддерживает удаленный сервер. Таким образом, вы запрашиваете у Wininet информацию, которую он не может вам предоставить.

0 голосов
/ 14 марта 2009

Раньше я получал похожую ошибку. Затем я передал дескриптор, возвращенный HttpOpenRequest (...), в InternetQueryOption, и он работал просто отлично. Попробуйте.

0 голосов
/ 12 ноября 2008

Я сделал это, просто (случайно) выбрал для краткости. Так что здесь будет весь код "образца":

  HINTERNET hReq = InternetOpen(...)
  if (!hReq) { printf("InternetOpen Error: %d", GetLastError()); }

  DWORD dwFlags = 0;
  DWORD dwBuffLen = sizeof(dwFlags);
  BOOL ret = false;

  InternetQueryOption(hReq, INTERNET_OPTION_SECURITY_FLAGS,
                      (LPVOID)&dwFlags, &dwBuffLen);
  if (!ret) { printf("InternetGetOption Error: %d", GetLastError()); }

  dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
  ret = InternetSetOption(hReq, INTERNET_OPTION_SECURITY_FLAGS,
                          &dwFlags, sizeof (dwFlags) );
  if (!ret) { printf("InternetSetOption Error: %d", GetLastError()); }

  InternetOpenURL(hReq, ...)

Кроме того, я могу использовать этот же дескриптор HINTERNET (hReq) с InternetOpenURL для загрузки файла с веб-сервера, не поддерживающего SSL (т. Е. С использованием прямого HTTP), что, по-видимому, указывает на то, что это хороший дескриптор. Является ли мое использование или понимание InternetQueryOption недействительным?

0 голосов
/ 11 ноября 2008

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

if (hReq == NULL) {
    printf("InternetOpen Error: %d", GetLastError());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...