Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用InternetQueryOption时,什么会导致错误\u INTERNET\u不正确的\u句柄\u类型(12018)?_C_Wininet - Fatal编程技术网

C 使用InternetQueryOption时,什么会导致错误\u INTERNET\u不正确的\u句柄\u类型(12018)?

C 使用InternetQueryOption时,什么会导致错误\u INTERNET\u不正确的\u句柄\u类型(12018)?,c,wininet,C,Wininet,我正在开发一个简单的小功能,使用WinInet函数,即InternetOpen和InternetOpenURL,从启用SSL的网站下载文件。我最初调用InternetOpenURL失败,出现错误\u INTERNET\u无效\u CA(12045),因为我在测试服务器上使用自签名证书,并发现()修复方法似乎是使用InternetQueryOption/InternetSetOption组合将各种标志传递给INTERNET\u OPTION\u SECURITY\u flags选项。但是,现在In

我正在开发一个简单的小功能,使用WinInet函数,即InternetOpen和InternetOpenURL,从启用SSL的网站下载文件。我最初调用InternetOpenURL失败,出现
错误\u INTERNET\u无效\u CA
(12045),因为我在测试服务器上使用自签名证书,并发现()修复方法似乎是使用InternetQueryOption/InternetSetOption组合将各种标志传递给
INTERNET\u OPTION\u SECURITY\u flags
选项。但是,现在InternetQueryOption失败,GetLastError()响应
错误\u INTERNET\u不正确\u句柄
(12018)。你知道为什么会这样吗?我使用的句柄直接来自InternetOpenURL,它以前在使用非SSL InternetOpenURL时运行良好。这不是正确的手柄吗

我没有实际的代码(不同的计算机),但它与下面的代码非常相似,在InternetGetOption上失败,出现
错误\u INTERNET\u不正确\u句柄

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

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

if (hReq == NULL) {
    printf("InternetOpen Error: %d", GetLastError());
}
我已经做到了,只是(无意中)为了简洁而省略了。下面是完整的代码“示例”:


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

来自MSDN docs for INTERNET\u OPTION\u SECURITY\u标志:

请注意,检索到的数据如下所示 way与具有 已发生,其安全级别无法更改 不再需要改变


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

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

我很困惑,你是从InternetOpenUrl而不是InternetOpenUrl传递句柄,那么http和https有什么关系呢?顺便说一句,我想你是指“互联网查询选项”,而不是“get”选项。我最初是在中间没有因特网选项选项的情况下尝试这个代码的,并且得到了错误<代码> ErrRo.ItNET.ValuiSIDCA.<代码>(12045),所以我试图在忽略实际的HTTPS之前设置忽略无用的CAS的选项。是的,我是指printf中的InternetQueryOption。我已经这样做了,只是(无意中)为了简洁而省略了,并编辑了原始问题以包含示例。另外,我可以使用与InternetOpenURL完全相同的HINTERNET句柄(hReq)从非SSL URL下载文件,这似乎表明它是一个好的句柄。
  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, ...)