什么会导致ERROR_INTERNET_INCORRECT_HANDLE_TYPE(12018)与InternetQueryOption?

时间:2008-11-10 22:00:15

标签: c wininet

我正在开发一个简单的小功能,使用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可以正常工作。这不应该是正确的句柄吗?

我没有实际的代码(不同的计算机),但它与以下内容非常相似,并且在使用ERROR_INTERNET_INCORRECT_HANDLE的InternetGetOption上失败:

  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 个答案:

答案 0 :(得分:1)

来自INTERNET_OPTION_SECURITY_FLAGS的MSDN文档:

  

请注意检索到的数据   方式涉及具有的交易   发生了,其安全级别不能   更长的时间。

您的手柄上尚未发生任何交易。 InternetOpen为您提供了根HINTERNET句柄。这可能适用于HTTP,FTP或Gopher连接 - 而安全选项非常特定于HTTPS,并且在很大程度上还取决于远程服务器支持的内容。因此,您要求Wininet提供无法提供的信息。

答案 1 :(得分:0)

我发现您没有查看hReqInternetOpen回来的InternetOpen。也许这是你问题的根源。如果您在调用if (hReq == NULL) { printf("InternetOpen Error: %d", GetLastError()); } 之后立即添加它,请查看此内容:

{{1}}

答案 2 :(得分:0)

我已经这样做了,只是(意外地)为了简洁而省略了。所以这里将是整个代码“sample”:

  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, ...)

此外,我可以使用与InternetOpenURL完全相同的HINTERNET句柄(hReq)从非SSL网络服务器下载文件(即使用直接HTTP),这似乎表明它是一个很好的句柄。我对InternetQueryOption的使用或理解是否无效?

答案 3 :(得分:0)

我曾经收到类似的错误。然后我将HttpOpenRequest(...)返回的句柄传递给InternetQueryOption,它运行得很好。尝试一下。