• POST教程笔记


    ①、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();
    }
  • 相关阅读:
    算法疑难(js实现)---5、变态跳台阶
    算法疑难(js实现)---4、跳台阶(记忆化递归)
    算法疑难(js实现)---3、两个栈来实现一个队列
    算法疑难(js实现)---2、重建二叉树
    Ext的Panel总结(好文章)
    Extjs datefield 日历控件中文显示
    EXTJS项目实战经验总结一:日期组件的change事件:
    ExtJs内的datefield控件选择日期过后的事件监听select
    ExtJs FormPanel布局
    开发extjs常用的插件
  • 原文地址:https://www.cnblogs.com/Lthis/p/4926410.html
Copyright © 2020-2023  润新知