2014-01-07 249 views
1

我想让ie的IWebBrowser不需要选择证书,所以我使用InternetSetOption()来做到这一点。代码是:使用WinInet :: InternetSetOption()总是返回false并且GetLastError()返回12018

HCERTSTORE hMyStore = CertOpenSystemStore(0, _T("MY"); 
PCCERT_CONTEXT pDesiredCert = NULL; 
pDesiredCert=CertFindCertificateInStore( 
    hMyStore, 
    X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 
    CERT_FIND_SUBJECT_STR, 
    L"cnstr", 
    NULL); 

if (InternetSetOption (NULL, INTERNET_OPTION_CLIENT_CERT_CONTEXT, 
     (LPVOID)pDesiredCert, sizeof(CERT_CONTEXT)) == FALSE) { 
    DOWRD i = GetLastError(); 
} 
... 

我在“我的”商店中获得证书。当我使用InternetSetOption()设置证书,它返回false,错误代码为12018.我搜索关于此错误代码的一些资料:

“ 12018 ERROR_INTERNET_INCORRECT_HANDLE_TYPE手柄提供的类型不正确,此操作”

我想设置的全局设置,所以我设置为NULL第一个参数,并在功能InternetSetOption()的第一个参数不能NULL?我如何正确设置选项?

+0

为什么c#被标记?这是什么语言?如果C++从标签中删除c# –

+0

对不起,因为我认为C#使用了一些api。我已经删除了。 – lvshuchengyin

+0

您不能使用NULL句柄,IE不会公开它使用的HINTERNET句柄。这当然会给这种方法带来厄运。通过Google搜索“为Internet Explorer安装证书”提前完成。 –

回答

1

正如您已经告诉过的,您不能使用NULL作为INTERNET_OPTION_CLIENT_CERT_CONTEXT选项。尽管某些选项可能具有NULL的值,例如INTERNET_OPTION_CONNECT_RETRIESINTERNET_OPTION_DATA_RECEIVE_TIMEOUT,但它不能。

Option Flags

你必须使用InternetOpen()InternetConnect()使用有效HINTERNET。 下面的链接将指导您在'HINTERNET Handle的范围'部分输入有效的HINTERNET

Setting and Retrieving Internet Options

而且,你必须检查hMyStorepDesiredCert值的那些是否NULL,也。

**编辑:**

不能使用IWebBrowser2得到HINTERNET。它只是公开了WebBrowser控件的方法和属性。所以,你必须使用InternetConnect()

例如,需要代理进行认证的客户端应用程序可能不需要在每次应用程序尝试访问Internet资源时设置代理用户名和密码。如果给定连接上的所有请求都由同一个代理处理,则在连接类型HINTERNET句柄(即通过调用InternetConnect创建的句柄)上设置代理用户名和密码将允许从此HINTERNET句柄派生的任何调用使用相同的代理用户名和密码。每次通过HttpOpenRequest创建HINTERNET句柄时设置代理用户名和密码都需要额外的和不必要的开销。请注意,如果应用程序使用需要验证的代理,则应在每个新连接上设置代理凭据。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa385384(v=vs.85).aspx

我也写了一篇关于如何使用InternetConnect()一些有用的参考链接。

C++ WinHTTP InternetReadFile not retrieving entire source

SSL with WinHTTP

+0

谢谢,它帮助我!我可以获得IWebBrowser2控件,在这种情况下我该怎么办? – lvshuchengyin

+0

@lvshuchengyin我编辑了我的答案。我希望这会对你有所帮助。谢谢你的评论。 – hyun

+0

InternetConnect()不起作用。只有HttpOpenRequest的HINTERNET可以设置为INTERNET_OPTION_CLIENT_CERT_CONTEXT,但它可能会影响IWebBrowser2。但谢谢你的回答! – lvshuchengyin

0

我相信应用答案是正确的。虽然存在另一个问题,它以类似的方式显示自己。
如果错误地定义了常量INTERNET_OPTION_CLIENT_CERT_CONTEXT,则可能会收到错误“INCORRECT_HANDLE_TYPE”。在这种情况下,你只会传递错误的选项。右边的数值是84(DEC)在WinInet中

#define INTERNET_OPTION_CLIENT_CERT_CONTEXT 84 

在WINHTTP相应的常数应

#define WINHTTP_OPTION_CLIENT_CERT_CONTEXT 47 

不要混合使用它们。谨慎小心,并且有一个很好的时间编码!