POST教程筆記 - WinHttp獲取網頁源碼


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM