我正在使用一个简单的小功能,使用WinInet函数(即InternetOpen和InternetOpenURL)从启用SSL的网站下载文件。我最初使用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, ...)

最佳答案

从INTERNET_OPTION_SECURITY_FLAGS的MSDN文档中:


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


尚未处理您的交易。 InternetOpen为您提供根HINTERNET句柄。这可能适用于HTTP,FTP或Gopher连接-而安全选项相当特定于HTTPS,并且在很大程度上还取决于远程服务器支持的功能。因此,您要向Wininet索取无法提供的信息。

关于c - 是什么导致InternetQueryOption出现ERROR_INTERNET_INCORRECT_HANDLE_TYPE(12018)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/279326/

10-11 00:49