zoukankan      html  css  js  c++  java
  • C++ COM编程之IUnknown接口

      COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能被外界所感知的部分,实际就是一组方法(虚函数).   
             IUnknown是所有接口的基础,他负责两项工作:   
             IUnknown::QueryInterface负责得到该组件的其他接口的指针   
             IUnknown::AddRef/Release负责管理该组件的生存期,但有人使用该组件时,保证该组件不会被意外删除;再没人使用该组件时,保证该组件被自动删除  


      COM是组件对象模型,她是继面象对向之后的一种思想,而不是一种简单的实现。   
      通过IDL,很多具体的工作都可以实现她,如VC、VB等。   
      一句话:COM是接口(组件)的集合,接口是方法和属性的集合。   
      要了解COM,就得先了解IUnknown接口,IUnknown接口的C++形式的定义如下:   
      interface   IUnknown   
      {   
              virtual   HRESULT   _stdcall   QueryInterface([in]REFIID   iid,[out]void   *   *   ppv)=0;   
              virtual   ULONG   _stdcall   AddRef(void)=0;   
              virtual   ULONG   _stdcall   Release(void)=0;   
      }   
      她实现了“接口查询”和“引用计数”,她是一个纯抽象基类。   
      所有COM   定义的接口都必须从她继承。   
      实现的COM接口都应该遵守一定的原则:   
      1。查询IUnknown接口得到的必须一样。   
      2。接口对称性。   
      3。接口相互性。   
      4。接口传递性。   
      5。时间无关性。   

      如果你学过C++或类似语言的话,这就比较好理解了。在C++里,一个子类可以从父类继承,这样子类可以复用父类的函数和成员。在COM里,一个接口和一个类很相似,一个接口可以从另一个接口继承,但是与C++的区别 是,接口的继承只是继承说明,不继承实现。微软规定了所有的标准接口必须从IUnknown接口“继承”,以获得组件的两个基本能力:引用计数和查询接口。   

          IUnknown接口是一个很普通的类或结构,你甚至可以自己写他,只是他有特殊的规定,必须有QueryInterface,AddRef,Relaese方法。可以说他是所有COM类的基类。原始的IUnknown类是一个纯虚类,什么也不能干,用户必须重载并实现他的所有方法,之所以要用IUnknown虚拟类,只是为了接口统一。也就是说所有COM类这三个方法的地址在函数虚拟表中是完全一样的。
         COM中的接口和C++中的类有些是相同的,但是也有一些区别,在COM中有一些接口他里面有些函数是微软在出厂时就已经编写好了的,但是,他也提供了一些多余的接口,他只做了定义,但是没有实例化,你可以利用VC编写程序了将他实例化,就可以实现自己要求的功能了,但是你也要编写一个注册程序,至于如何编写要看你利用的接口而定了。

     

  • 相关阅读:
    linux使用docker-compose部署软件配置
    Linux CentOS Python开发环境搭建教程
    Linux使用scp命令进行文件远程拷贝详解
    浅析Vue.js 中的条件渲染指令
    浅谈Vue响应式(数组变异方法)
    Laravel框架定时任务2种实现方式示例
    Docker 运行时的用户与组管理的方法
    laravel5实现微信第三方登录功能
    Linux服务器间文件实时同步的实现
    从零开始搭建vue移动端项目到上线的步骤
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15147488.html
Copyright © 2011-2022 走看看