3

WinInet 関数、つまり InternetOpen と InternetOpenURL を使用して、SSL 対応の Web サイトからファイルをダウンロードする単純な小さな関数に取り組んでいます。ERROR_INTERNET_INVALID_CAテストサーバーで自己署名証明書を使用していたため、最初は InternetOpenURL の呼び出しに (12045) で失敗していましたが、 ( http://support.microsoft.com/kb/q182888/ ) 修正INTERNET_OPTION_SECURITY_FLAGSオプションにさまざまなフラグを渡すために InternetQueryOption/InternetSetOption の組み合わせを使用しているようです。ただし、現在、InternetQueryOption は、ERROR_INTERNET_INCORRECT_HANDLEGetLastError() からの (12018) 応答で失敗します。なぜこれが当てはまるのでしょうか?以前は非 SSL InternetOpenURL で正常に機能していた InternetOpen から直接取得したハンドルを使用しています。これは正しいハンドルではないでしょうか。

実際のコード (別のコンピューター) はありませんが、次のコードと非常によく似ており、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

3 に答える 3

2

以前も同様のエラーが発生していました。次に、HttpOpenRequest(...)によって返されたハンドルをInternetQueryOptionに渡しましたが、問題なく機能しました。やってみよう。

于 2009-03-14T10:55:57.787 に答える
1

INTERNET_OPTION_SECURITY_FLAGS の MSDN ドキュメントから:

この方法で取得されたデータは、発生したトランザクションに関連しており、そのセキュリティ レベルは変更できないことに注意してください。

あなたのハンドルでまだトランザクションが発生していません。InternetOpen はルート HINTERNET ハンドルを提供します。これは、HTTP、FTP、または Gopher 接続に適用できますが、セキュリティ オプションは HTTPS にかなり固有であり、リモート サーバーがサポートするものにも大きく依存します。そのため、Wininet が提供できない情報を Wininet に求めていることになります。

于 2009-02-08T11:25:40.270 に答える
0

hReqから戻ってきた をチェックしていないようですねInternetOpen。おそらくそれがあなたの問題の根源です。への呼び出しの直後に追加すると、これが何を意味するかを確認してくださいInternetOpen

if (hReq == NULL) {
    printf("InternetOpen Error: %d", GetLastError());
}
于 2008-11-10T22:35:34.150 に答える