①、WinINet与WinHttp的异同点,为什么使用WinHttp讲解?
详情见:《WinINet与WinHttp总结》文档,已经打包给大家了。
②、WinHttp接口调用方式:
微软官方地址:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspx
WinHttp微软提供了两种调用方式:C++调用API的版本、COM组件的版本。这里面使用的是 C++ Interface 接口的组件的方式来给大家讲解。
③、WinHttp常用命令讲解:
详情见:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspx
/* ①、获取网页源码的步骤: 1、COM组件初始化; 2、定义WinHttp对象指针; 3、创建并实例化WinHttp组件; 4、调用Open方法打开连接; 5、调用Send方法发送请求; 6、获取ResponseText返回的文本; 7、释放WinHttp组件对象; 8、释放WinHttp对象指针; 9、卸载COM组件; */
/* ②、使用WinHttp3种方法的优缺点 1、类型库生成包装类的方式:优点->使用方便,贴近C++,缺点->COM接口的默认缺省参数必须填写,不灵活; 2、import+接口方式:优点->COM接口的申请与释放自己控制,很灵活,缺点->控制不好,引起内存泄露,且COM组件的实例化参数较多; 3、import+智能指针包装类的方式:优点->智能指针,使用方便,不用担心内存泄露,COM组件实例化简单,可使用COM组件的默认缺省参数; */
下面给出三种方法的使用示例:
方法1:
// 方法1 类型库生成包装类的方式:优点->使用方便,贴近C++,缺点->COM接口的默认缺省参数必须填写,不灵活; void CHttpTestDlg::OnBnClickedButton1() { CoInitialize(NULL); CWinHttpRequest* pWinHttp = new CWinHttpRequest; BOOL bRet = pWinHttp->CreateDispatch(L"WinHttp.WinHttpRequest.5.1"); if (!bRet) return; // CLSID clsid = { 0 }; // CLSIDFromProgID(L"WinHttp.WinHttpRequest.5.1", &clsid); // pWinHttp->CreateDispatch(clsid); COleVariant async = VARIANT_FALSE; pWinHttp->Open(L"GET", L"http://www.baidu.com", async); pWinHttp->Send(vtMissing); CString strSrc = pWinHttp->get_ResponseText(); MessageBox(strSrc); pWinHttp->ReleaseDispatch(); delete pWinHttp; CoUninitialize(); }
// 以上,CWinHttpRequest是类型库生成包装类
方法2:
#import "C:\windows\SysWOW64\winhttp.dll" no_namespace // 方法2 void CHttpTestDlg::OnBnClickedButton2() { BSTR bstrBody; CString strBody; CoInitialize(NULL); IWinHttpRequest* pHttpReq = NULL; HRESULT hr = CoCreateInstance( __uuidof(WinHttpRequest), nullptr, CLSCTX_ALL, __uuidof(IWinHttpRequest), (PVOID*)&pHttpReq ); if (FAILED(hr)){ goto _exit0; } hr = pHttpReq->Open(L"GET", L"http://www.baidu.com"); if (FAILED(hr)){ goto _exit1; } hr = pHttpReq->Send(); if (FAILED(hr)) { goto _exit1; } hr = pHttpReq->get_ResponseText(&bstrBody); // <=> _bstr_t bStrRsp = pHttpReq->ResponseText; if (FAILED(hr)) { goto _exit1; } strBody = bstrBody; MessageBox(strBody); _exit1: pHttpReq->Release(); _exit0: CoUninitialize(); }
方法3:
#import "C:\windows\SysWOW64\winhttp.dll" no_namespace // 方法3 void CHttpTestDlg::OnBnClickedButton3() { BSTR bstrBody; CString strBody; CoInitialize(NULL); IWinHttpRequestPtr pHttpReq = NULL; HRESULT hr = pHttpReq.CreateInstance(__uuidof(WinHttpRequest)); if (FAILED(hr)){ goto _exit0; } hr = pHttpReq->Open(L"GET", L"http://www.baidu.com"); if (FAILED(hr)) { goto _exit0; } hr = pHttpReq->Send(); if (FAILED(hr)) { goto _exit0; } pHttpReq->get_ResponseText(&bstrBody); strBody = bstrBody; MessageBox(strBody); _exit0: CoUninitialize(); }