一个简单的com组件的实现

1.什么是com

 

com是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块;等等。

 COM组件由以Win 32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码所组成。遵循COM规范编写出来的组件将能够满足对组件架构的所有要求。COM组件可以给应用程序、操作系统以及其他组件提供服务;自定义的COM组件可以在运行时刻同其他组件连接起来构成某个应用程序;COM组件可以动态的插入或卸出应用。

2.动态链接库

   先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。

  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

 

   下面将给出一个利用dll实现的组件,当然这个组件并没有完全实现,缺少将组件添加到注册表中的功能。

组件

   在该组件中我们实现了IX和IY的接口,IX和IY借口约定该组件必须提供Fx和Fy方法的实现。

 

query.h

 

 

在该头文件中我们定义了一些宏,这些宏是为了我们定义组件和使用组件的方便性而定义的,在定义组件时通过#define DLLEXPORT 就可以给出一个动态链接库中定义的函数,而在使用时因为没有田间#define DLLEXPORT宏所以是导入定义好的函数。

query.cpp

 

正如上面提到的那样,在该组件定义文件中,我们定义了DLLEXPORT宏,所以导入头文件是这一部分

#define DLLFUNCTION _declspec(dllexport)

#define DLLINTERFACE extern "C" interface _declspec(dllexport)

#define DLLCLASS extern "C" class _declspec(dllexport) 

当用这些宏来修饰函数时,表明这是dllexport 的即是定义函数。

guids.cpp

 

这一部分是定义IID,通过guidgen工具生成,没有什么需要解释的。

编译生成query.dll,query.lib,query.h文件可以将这几个文件copy到你自己新建的一个文件夹下面,并将这个文件夹添加到系统路径中,并导入客户端使用时导入query.lib.

 

客户端

 

test.cpp

 

 

 

需要解释的是create.h文件现在可以不用导入,这是后来新增的。这样子就是一个简单的使用com组件的例子。

 

再进一步解释一下create.h文件。

 

其实这是另外定义了一个组件导入函数,这样子就可以方便地通过制定的dll导入需要的组件真正实现动态链接的功能,其定义在另一个dll中。

create.h

 

 

create.cpp

 

 

按上面说过的同样的方式处理create.dll,create.lib和create.h就可以如同test.cpp中注释掉的IUnknown* pIUknown=CallCreateInstance("querylink.dll");了。

当然由于没有将编写好的组件添加到注册表中,并不能像真正的组件哪像使用,后面我将会给出如何注册一个自己编写的组件。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值