您的位置:首页 > 其它

WINCE应用开发笔记四--COM

2010-02-16 19:13 218 查看
在应用开发笔记二中,谈到了COM与GCF的一些共同之处,而在实现上,两者是在不同层次上的。JAVA是解释型的语言,在Class机制的实现中,是以字符串查找的方式实现连接的。而COM的实现则是编译型语言,以C语言为例,编译器在编译源文件时,生成一个个的目标文件,并开始连接,确定每一个函数的地址。如果函数在外部定义,需要确定使用函数的方式。例如,动态链接库,以二进制的形式存在;当需要使用动态链接库中的函数时,需要确定动态链接库在内存中的位置,入口点的位置,并传入参数,即可实现对动态库中函数的调用,这个参数一般都是一个标识。通过这种方式,可以削弱程序与其所依赖的动态链接库的相关性。在程序编译时,只需要动态库的头文件即可,这是SDK中的内容。

这是C语言中的一些common sense;从对数据使用的角度看,最早的是结构,是数据的集合;后来,在C++中,增加了对数据的操作,就是方法;简单地讲,类是结构与对结构中数据的操作方法的集合;在这个阶段,编译器在编译时确定函数的地址。由于类的引入,增加了this指针;这是因为每个对象都有自己的数据,对象所占据的空间是在运行时确定的,类中的方法需要使用这些动态分配的空间,因此,编译器在编译类方法时,默认在类方法中增加一个参数,就是this指针,通过指针,可访问对象的数据空间。

类引入了面向对象的概念,类的继承关系、类的多态,使得编译器在处理C++时变得更复杂。为了实现多态,C++采用了虚函数表,即在对象空间中,增加了一个指针,指向虚函数表。对于声明为virtual的函数,在编译时,将函数地址存入虚函数表,在运行时,在虚函数表中取方法的地址;通过这种方法,在运行时确定地址。

关于API:

通过确定API,可实现调用者和被调用者的独立。在API确定后,调用者和被调用者的修改不会影响对方。

随着API越来越多,对这些API的管理成了问题;在实际应用中,往往是一组API对应一个特定的功能;通过对API的归类,产生了接口的概念。接口是逻辑上的概念,与实现无关。在COM中,还对接口进行了组织,即接口的继承关系。

对于一个类的实现,可以实现多个接口。类如何将这些接口暴露给接口的使用者呢?

最直接的做法就是类的实现中提供对接口的支持。每一个接口对应一个虚拟函数表,获得了这个指针,就获得了对虚拟函数表的使用方法。

接口的定义和标识:

对于接口来说,接口的成员函数是确定的,其虚函数表是确定的,每个成员函数的参数和返回值是确定的。因此,接口的内存结构是确定的。无论什么语言的实现,只要其内存结构支持接口的内存结构就可以支持COM实现。

接口必须满足的几个规范:

1. 成员函数的第一个指针必须为this;

2. 传入的字符串参数必须为Unicode;

3. 调用习惯必须为stdcall;有两种调用习惯,一种是cdecl;一种是stdcall;cdecl要求被调用函数处理栈的恢复。

关于IUnknown接口:

IUnknown的两个特性:生存期控制和接口查询;

在COM中,有三个级别:COM组件(整个COM)、COM类、接口。在使用COM前,需要将整个COM组件导入内存,在需要使用某个COM类时,动态创建某个COM类的对象并获取相应的接口。生存期的控制主要是COM组件控制在什么时候释放内存的机制。如果针对整个COM组件计数,则无法判断什么时候释放COM类对象的空间;如果针对接口计数,又太细;目前的方法是对COM类进行计数,当计数值为0时释放类对象的空间。IUnknown接口了对计数值加和减的方法;一个类可能支持多个接口,接口查询是通过一个接口获取另一个接口的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: