【问题标题】:What would cause a ERROR_INTERNET_INCORRECT_HANDLE_TYPE (12018) with InternetQueryOption?什么会导致 InternetQueryOption 出现 ERROR_INTERNET_INCORRECT_HANDLE_TYPE (12018)?
【发布时间】:2008-11-10 22:00:14
【问题描述】:

我正在开发一个简单的小功能,使用 WinInet 功能从启用 SSL 的网站下载文件,即 InternetOpen 和 InternetOpenURL。我最初使用 ERROR_INTERNET_INVALID_CA (12045) 调用 InternetOpenURL 失败,因为我在测试服务器上使用自签名证书,并发现 (http://support.microsoft.com/kb/q182888/) 修复似乎是使用 InternetQueryOption/ InternetSetOption 组合将各种标志传递给INTERNET_OPTION_SECURITY_FLAGS 选项。然而,现在 InternetQueryOption 失败,来自 GetLastError() 的 ERROR_INTERNET_INCORRECT_HANDLE (12018) 响应。任何想法为什么会这样?我正在使用直接来自 InternetOpen 的句柄,它以前与非 SSL InternetOpenURL 一起工作得很好。这不应该是正确的句柄吗?

我没有实际代码(不同的计算机),但它与以下非常相似,并且在 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, ...)

【问题讨论】:

  • 我很困惑,您是从 InterntOpen 而不是 InternetOpenUrl 传递句柄,那么 http 与 https 怎么可能有关系?顺便说一句:我假设您的意思是 InternetQueryOption,而不是 get 选项。
  • 我最初是在中间没有 Internet*Option 东西的情况下尝试这段代码,并得到错误 ERROR_INTERNET_INVALID_CA (12045),所以我试图设置在我实际执行 HTTPS 之前忽略无效 CA 的选项。是的,我指的是 printf 中的 InternetQueryOption。

标签: c wininet


【解决方案1】:

我曾经收到过类似的错误。然后我将 HttpOpenRequest(...) 返回的句柄传递给 InternetQueryOption,它工作得很好。试试看。

【讨论】:

    【解决方案2】:

    来自 INTERNET_OPTION_SECURITY_FLAGS 的 MSDN 文档:

    请注意,检索到的数据 方式与具有 发生,其安全级别不能 再改。

    您的句柄尚未发生任何交易。 InternetOpen 为您提供根 HINTERNET 句柄。这可能适用于 HTTP、FTP 或 Gopher 连接——而安全选项相当特定于 HTTPS,并且很大程度上还取决于远程服务器支持的内容。因此,您正在向 Wininet 询问它无法提供给您的信息。

    【讨论】:

      【解决方案3】:

      我看到你没有检查你从InternetOpen 回来的hReq。也许这就是你问题的根源。如果您在调用 InternetOpen 之后立即添加它,看看这会告诉您什么:

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

      【讨论】:

      • 我已经这样做了,只是(不小心)为了简洁而省略并编辑了原始问题以包含示例。此外,我可以使用与 InternetOpenURL 完全相同的 HINTERNET 句柄 (hReq) 从非 SSL URL 下载文件,这似乎表明它是一个很好的句柄。
      猜你喜欢
      • 2023-01-12
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多