①、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(); }