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. WPF属性与特性的映射(TypeConverter)

    1,定义一个类 public class Human { public string Name { get; set; } public Human Child { get; set; } } 2在X ...

  2. 大写String和小写string的区别

    1.string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色) ; 2.c# string映射为.net Framework的String ; 3.如果用 ...

  3. mysql中判断表中是否存在某条记录

    SELECT CASE WHEN EXISTS (SELECT * FROM usergroupmap WHERE groupId = groupIdIn AND userId = v_friendI ...

  4. uva 10779 Collectors Problem 网络流

    链接 一共有n个人, m种收藏品, 每个人拥有的收藏品的种类和个数都是不相同的. 假设2-n这些人都只和1互相交换, 比例是1:1, 并且, 2-n这些人, 只换自己现在没有的, 如果他现在有第二种, ...

  5. Oracle字符集转换

            这几天在工作中碰到一个字符乱码的问题,发现在cmd窗口的sqlplus中直接update一个中文和使用@调用一个文件作同样更新的时候,存储的结果 竟不一样.一时比较迷惑,对Oracle ...

  6. ProFTPD 初探

    ProFTPD:一个Unix平台上或是类Unix平台上(如Linux, FreeBSD等)的FTP服务器程序.

  7. CentOS 6.4 U盘启动盘制作、安装及遇到的问题解决

    用UltraISO Premium Edition  9.3 制作的CentOS 6.4 U盘安装盘, 制作过程參考我写的百度经验:UltraISO制作U盘系统盘安装CentOS经验分享 安装时提示P ...

  8. HTML5API___geolocation

    地理位置查询:geolocation window.navigator.geolocation 该对象下总共有3个方法 Geolocation {getCurrentPosition: functio ...

  9. bmob云 实现注册和登录的功能

    向大家介绍一款我感觉非常溜的一款后端云服务bmob云 借助bmob云我们可以实现注册和登录页面的功能,下面就让我给大家演示一下借助bmob云服务实现这两个功能吧.  1. 用户是一个应用程序的核心.对 ...

  10. hdu acm 2154(多解取一解)

    //题目中结果有一条限制就是最后必须跳回A,如果我们的思想框在这个条件上就很容易卡住,因为这样的条件下的路径很难有规律的罗列,然而我们说这个图形中有三个区域,我们算出每个区域的第n-1次的种类数,然后 ...