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。时间无关性。   
要学好COM,一定得弄清楚COM的原理。  (lzcwyd回复于 2000-12-25 19:53:00)

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

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

我曾经看到过一套教程,非常好,有生动的例子和循序渐进的说明。最终的结论是,要在Windows平台上实现组件(可独立发布的程序单元)应该是COM现在这种形式。URL为:http://beta.develop.com/com/contents.asp   比较适合于初学者,只需C++的基础,学起来也比较轻松。学完之后,比看任何一本关于COM的书都要理解得好。 以前MS也有人写过类似的文章,就好像是,从组件的概念出发推导出IUnknown的必然,进一步也就是COM的必然。 这是很有意思的。IUnknown是COM的基础,但COM作为组件体系还需要很多很多东西,于是便演变成今天这么复杂的一项技术。


COM编程之IUnknown接口的更多相关文章

  1. Java 并发编程之 Condition 接口

    本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...

  2. C++混合编程之idlcpp教程Python篇(8)

    上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:Pyt ...

  3. C++混合编程之idlcpp教程Lua篇(8)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial6中,同样加入了四个文件:LuaTutori ...

  4. C++混合编程之idlcpp教程Python篇(6)

    上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...

  5. C++混合编程之idlcpp教程Lua篇(6)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...

  6. C++混合编程之idlcpp教程Python篇(5)

    上一篇在这  C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...

  7. [转载]并发编程之Operation Queue和GCD

    并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...

  8. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  9. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

随机推荐

  1. 试用cmd markdown

    欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想 ...

  2. Deep Learning(深度学习)学习笔记整理系列之(七)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  3. Oracle 导入本地dmp文件 详细操作步骤

    以下操作均在命令行窗口中进行 /*连接数据库*/ C:\Users\hqbhonker>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Prod ...

  4. Sql Server之数据库规范——1、自动化规范命名

    一.废话: 随着数据库的规模越来越大,数据库的表也有成百上千,如果需要对数据库表名及字段名做操作,单个还好,直接一条语句搞定了,但如果要对整个库的所有表和字段名做操作,那就显得有点麻烦了.因此,我们需 ...

  5. hadoop hdfs 一些命令记录

    1.列出目录下的对象:hadoop fs -ls /lib 2.统计文件行数:hadoop fs -cat  /文件* | wc -l 3.统计文件或者目录大小:hadoop fs -count /l ...

  6. C#学习日志 day 2 plus ------ hyper-V 开启方法

    hyper-V的开启需要两个步骤. 第一是在bios中开启 virtualization technology--虚拟化技术 在process setting中改为enabled. 进入bios界面的 ...

  7. gmpy2安装使用方法

    GMP(GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库),它是一个开源的高精度运算库,其中不但有普通的整数.实数.浮点数的高精度运算,还有 ...

  8. composer api 参考

    composer note 简介 composer 是php的依赖管理工具.可以声明项目所依赖的库,composer会帮我们安装上 composer 默认基于项目来管理和安装库(包),将依赖的库安装到 ...

  9. perl lwp get uft-8和gbk

    gbk编码: jrhmpt01:/root/lwp# cat x2.pl use LWP::UserAgent; use DBI; $user="root"; $passwd='R ...

  10. Javascript 风格向导

    序   大部分针对Javascript最合理的方法归纳.   类型   • 原始类型:我们可以直接使用值. ο string ο number ο boolean ο null ο undefined ...