从零开始学编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

界面工厂编程视频教程广告联系qq1031180668广告位
查看: 624|回复: 2

#import+接口方式调用winhttp COM组件

[复制链接]
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    790

    主题

    1497

    帖子

    2652

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2652

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2016-1-14 22:31:34 | 显示全部楼层 |阅读模式
                                                         import+接口方式调用winhttp COM组件
        使用#import+接口的方式调用COM组件,首先就是用#import导入winhttp ,写法如下:
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    #import "C:\\windows\\system32\\Winhttp.dll"

    写上winhttp.dll的绝对路径,#import导入之后还要用
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    using namespace WinHttp;

    把IWinHttpRequest的命名为全局,省的每次都用winhttp::IWinHttpRequest。
    剩下的就是用老办法:
    1.COM组件初始化
    2.定义winhttp对象指针
    3.创建并实例化winhttp组件

    4.调用winhhtp的Open方法打开连接
    5.调用Send方法发送请求
    6.获取ResponseText返回的文本

    7.释放Winhttp组件对象
    8.释放Winhttp对象指针
    9.卸载COM组件

    COM组件初始化的
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CoInitialize(NULL);

    定义winhttp对象指针
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    IWinHttpRequest *pHttpReq = NULL;


    这里和类型库生成包装类调用COM组件不同,那里是用
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CWinHttpRequest *pHttpReq = new CWinHttpRequest();


    CWinHttpRequest是winhttp生成的包装类,这里是直接引用的winhttp所以就直接用winhttp对象的接口。


    创建并实例化winhttp组件
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CoCreateInstance(__uuidof(WinHttpRequest), NULL, CLSCTX_ALL, __uuidof(IWinHttpRequest), (LPVOID*)&pHttpReq);


    这里就要多说两句了,首先CoCreateInstance,用指定的类标识符创建一个COM对象,用指定的类标识符创建一个未初始化的对象
    函数原形:
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    STDAPI CoCreateInstance(
    REFCLSID rclsid, //创建的Com对象的类标识符(CLSID)
    LPUNKNOWN pUnkOuter, //指向接口IUnknown的指针
    DWORD dwClsContext, //运行可执行代码的上下文
    REFIID riid, //创建的Com对象的接口标识符
    LPVOID * ppv //用来接收指向Com对象接口地址的指针变量
    );

    就是用来实例化com组件的,首先第一个参数__uuidof(WinHttpRequest),__uuidof用来获取 某种结构、接口及其指针、引用、变量 所关联的GUID,GUID把它理解成一对特有的数字就行了,UUID  CLSID   IID 都属于GUID,只是代表的意思不同:
                                 UUID  : 代表COM  
                                 CLSID : 代表COM组件中的类   
                                 IID :代表COM组件中的接口
    当__uuidof的参数为COM时获取的就是COM的类标识符,当__uuidof的参数为类时获取的就是类的接口标识符,大概意思就是你给他葡萄它给你葡萄皮,你给他橘子他给你橘子皮,这样来说第一个参数和第四个参数就可以理解了。
    再看第二个参数,百度给出的解释是
    pUnkOuter
    [in] 如果为NULL, 表明此对象不是聚合式对象一部分。如果不是NULL, 则指针指向一个聚合式对象的IUnknown接口。

    额...我想说。。怪我喽,不懂什么是聚合对象,这个时候果断用NULL.....应该是修行不够暂时没接触到聚合对象这个东西,
    继续看第三个参数,第三个参数实际上让我们选择组件类别,可选项有:
    CLSCTX_INPROC_SERVER
    创建在同一进程中运行的组件。为能够同一进程中运行,
    组件必须是在DLL中实现的。
    CLSCTX_INPROC_HANDLER
    创建进程中处理器。一个进程中处理器实际上是一个
    只实现了某个组建一部分的进程中组件。该组件的其他部分将
    由本地或远程服务器上的某个进程外组件实现。
    CLSCTX_LOCAL_SERVER
    创建一个在同一机器上的另外一个进程中运行的组件。
    本地服务器是由exe实现的。
    CLSCTX_REMOTE_SERVER
    创建一个在远程机器上运行的组件。此标志需要分布式
    COM正常工作。
    那咱们用的CLSCTX_ALL是什么呢? CLSCTX_ALL就代表了这五个........算我没说。

    最后一个参数,用来接收指向接口地址的指针变量。如果函数调用成功,*ppv包括请求的接口指针
    COM对象指针,直接用上面定义的pHttpReq 就好了,函数执行成功之后,pHttpReq 也就获得了
    winhttp的接口指针。
    调用winhhtp的Open方法打开连接
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    pHttpReq->Open(_T("GET"),_T("http://www.c0ks.com"));



    调用Send方法发送请求
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    pHttpReq->Send();



    获取ResponseText返回的文本
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CString strText = pHttpReq->ResponseText;

       
        释放Winhttp组件对象
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
       pHttpReq->Release();


    释放Winhttp对象指针
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    //这里就不用释放了,因为压根没有给pHttpReq 分配内存




    9.卸载COM组件
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CoUninitialize();

    效果图:
    winhttp.png
    完整源代码下载看附件


    import 接口方式调用COM.rar

    132.97 KB, 下载次数: 19

    售价: 1 编程币  [记录]

    import+接口方式调用COM




    上一篇:vc++post图文教程
    下一篇:#import+智能指针winhttp COM组件获取网页源码
    不积跬步,无以至千里
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    790

    主题

    1497

    帖子

    2652

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2652

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2016-1-16 09:37:03 | 显示全部楼层
    发现代码又乱了。等下重新编辑下。不知道怎么回事贴出来的代码总是乱码
    不积跬步,无以至千里
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    790

    主题

    1497

    帖子

    2652

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2652

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2016-1-16 16:11:07 | 显示全部楼层
    乱码已修复
    不积跬步,无以至千里
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Archiver|小黑屋|sitemap|从零开始学编程 ( 豫ICP备15032706号-2 )

    GMT+8, 2017-5-24 23:40 , Processed in 0.093750 second(s), 39 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表