zoukankan      html  css  js  c++  java
  • COM技术内幕第三章笔记接口查询

    接口查询

    头文件:IUnknown接口定义包含在Win32 SDK的unknwn.h中。

    函数:QueryInterface, AddRef, Release

    用途:查询组件的其他接口。

    所有COM接口都需集成IUnknown,都支持QueryInterface。

    创建组件时,可以考虑建立一个组件并返回IUnknown指针,而不必使用new操作符。

    IUnknown * CreateInstance();

    IUnknown * CreateInstance()

    {

           //new一个实例,并返回IUnknown指针

    }

    QueryInterface带两个参数:

    HRESULT__stdcall QueryInterface(const IID& iid, void ** ppv);

    返回一个HRESULT值。该值并非某个结果的句柄,而是一个特定结构的32位值。

    可能的值有S_OK和E_NOINTERFACE。判断返回结果时不能直接比较,而应该使用宏SUCCEEDED或FAILED。

    使用QueryInterface查询两个接口的IUnknown,然后对结果进行比较,可以用来判断接口指针是否指向同一对象。

    COM组件通过QueryInterface来查询是否支持某接口。

    而C++类通过头文件则一开始就知道了该类支持的所有成员。

    对于为什么不能向COM组件查询它所支持的所有接口?此间有一个回答是

    你想对所支持的接口列表做什么捏?

    但COM也提供了一个名为类型库的手段,用来在运行时确定组件提供的接口。

    另外,分布式COM(DCOM)提供了一个新接口ImultiQI,有一个新的成员函数QueryMultipleInterfaces,用来一次调用查询组件的多个接口。减少网络数据的交换次数。

    在具体使用上,调用前查询是否支持某接口,然后再使用对应的接口方法。接口库通常只会增加不会更改。

    假设,建立了一个公司组件company,它支持打卡接口ICheck;

    在名为manage的公司办公程序中,使用了company组件的ICheck来考勤。

    一年后,组件更新位company2,新增打卡接口ICheck2。

    旧版本manage程序仍然是首先查询组件是否支持ICheck,然后调用ICheck。

    新版本manage2则会首先查询是否支持ICheck2,若不支持再查询是否支持ICheck。

    而旧版本manage即使运行在company2组件环境中,因为ICheck仍然完整保留下来,因此也运行照旧。

  • 相关阅读:
    数理统计与Matlab: 第4章 回归分析
    汽车各部位名称详解【图】
    线性代数:第四章 矩 阵1
    曲线救国的就业路线是否合理?
    TortoiseSVN 编辑日志信息报错
    Ironpython及其他托管语言中值类型最好使用构造函数赋值,否则无法赋值的问题
    线性代数:第五章 二次型
    Matlab基础
    技术基层管理者交流QQ群243460070
    MATLAB软件基础
  • 原文地址:https://www.cnblogs.com/mumuliang/p/1873489.html
Copyright © 2011-2022 走看看