Delphi面向对象学习随笔七:COM(转)


======================================================
注:本文源代码点此下载
======================================================

delphi面向对象学习随笔七:com

作者:巴哈姆特

http://www.cnpack.org

(转载请注明出处并保持完整)

上一篇,我们介绍了接口。如果没有接触过com对象的话,你会觉得接口真的很麻烦,也许会有:“还不如直接定义一个类更方便”的想法。

的确,没有经过com封装的接口确实比较麻烦。在我看来,没有经过com封装的接口似乎没有存在的意义。那么,什么是com对象呢?它有什么优点呢?接下来开始对com对象进行一个简单的介绍:

com是个二进制规范,它与实现的语言无关。这样,即使com对象由不同的编程语言创建,运行在不同的进程空间和不同的操作系统平台,这些对象也能相互通信。com既是规范,也是实现,它以com库的形式提供了访问com对象核心功能的标准接口以及一组api函数,这些api函数用于创建和管理com对象。com本质上仍然是客户服务器模式。客户(通常是应用程序)请求创建com对象并通过com对象的接口操纵com对象。服务器根据客户的请求创建并管理com对象。当然,客户和服务器这两种角色并不是绝对的。

记得我在刚刚接触com对象的时候,我师傅曾经给我说过:“com不是dll,虽然它可能会以后缀名为dll文件呈现在你面前,但是它绝对不是我们传统意义上所说的dll(动态链接库)”。

其实在我看来,进程内的com对象应该是一个以dll为载体而提供一些特殊服务的特殊的动态链接库。当然,也有进程外的com。

现在,我们演示怎么在delphi中利用向导建立一个简单的com模型。

首先:打开borland delphi 7.1(不好意思,我一般都是用这个版本。什么?为什么是7.1?就是7.0加个update1补丁包嘛-_-||)。

然后:把delphi默认为我们创建的application关掉,并在菜单中选择file->new->other,之后在弹出的窗口中找到activex页,双击activex library图标。

双击图标后,我们可以看到delphi已经帮我们建立了一个activex库,代码如下:

library project1;

uses

comserv;

exports

dllgetclassobject,// 返回类工厂的接口

dllcanunloadnow,// 是否可以释放该组件

dllregisterserver,// 注册函数

dllunregisterserver;// 反注册函数

{$r *.res}

begin

end.

我们会看到,在工程中,delphi已经帮我们定义好了四个输出函数(关于这几个函数更详细的说明,可以查阅更多的资料),我们先不管它们。

接下来,我们再使用菜单file->new->other并在activex页中创建com object,这时,我们可以看到一个对话框:其中classname是我们的对象名、instancing是对象创建模式、threading module为线程模式。我们使用newcomserver作为对象名,其他默认。ok后可以看到一个标题为“project11.tlb”的窗口,这个我们可以在这个窗口中为接口添加新的方法,例如我们添加一个getmessage方法。然后我们打开unit1.pas可以看到如下代码:

unit unit1;

{$warn symbol_platform off}

interface

uses

windows, activex, classes, comobj, project1_tlb, stdvcl;

// project1_tlb 接口所在单元

type

tnewcomserver = class(ttypedcomobject, inewcomserver)

// 实现接口的类

protected

function getmessage: hresult; stdcall;

// 我们刚刚添加的方法

{declare inewcomserver methods here}

end;

implementation

uses comserv;

function tnewcomserver.getmessage: hresult;

begin

messagebox(0, \'测试\', \'提示\', $40);

result:= getlasterror; // 我添加的代码

end;

initialization

ttypedcomobjectfactory.create(comserver, tnewcomserver, class_newcomserver, cimultiinstance, tmapartment);

// 类工厂

end.

之后,我们编译这个工程(ctrl+f9)将会生成一个project1.dll文件。保存并关闭这个工程。

接着,我们编写一段代码来测试这个com工程:创建一个普通的应用程序工程,并引用project1_tlb单元:

var // 注意,在测试代码中也需要引用project1_tlb单元,由于我们的接口声明在该单元内

newcomobject: inewcomobject; // 声明接口

begin

newcomobject:= createcomobject(class_newcomobject) as inewcomobject; // 创建com对象,

//class_newcomobject 的定义可以在project1_tlb.pas里找到

if newcomobject 运行->regsvr32.exe \"...project1.dll\"。看到注册成功的提示信息后,我们现在可以运行我们刚刚编写的那个测试程序来测试我们的com对象了,看看执行测试代码后,是否弹出了一个标题为“提示”,内容为“测试”的对话框呢?

我们可以看到,在com组件创建好以后,在exe调用的时候是相当简单的,而且,当我们某个方法的实现细节发生改动,只要方法声明不变,那么在软件升级的时候,我们可以只升级我们需要升级的com组件,而不需要改动其它的地方。这样可以有效的减轻维护的工作量。

当然,这个演示只是一个进程内的com,至于更详细的说明,可以去参阅更多的资料。

友情提示:activex是windows下实现com的一个组件规范。请不要把activex和com之间划上等号!


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值