分享
 
 
 

COM程序编写入门(全文-1)

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

COM程序编写入门

编写:李贤敏

日期:2004-5-2

名词解释:

OLE: (Object linking and embedding对象的链接与嵌入)

使得服务器模块和客户模块通过标准的接口进行通讯。两个模块可以在同一台计算机或位于不同的计算机上,位置对用户来说是无关紧要的。服务器模块实现了一组接口,客户模块通过这组接口进行通讯。

COM: (Component object modal组件对象模型)

实现了OLE的功能,具体可完成一下功能:

l 编写供多种语言使用的代码;

多种语言:指的是建立好的COM组件不在乎访问它的编程语言,任何一种编程语言只要知道COM组件的接口,访问是都能完成同样的功能。

l 创建ActiveX控件;

l 通过OLE Automation操纵其他应用程序;

如:Microsoft Excel的OLE编程接口,创建对象后,任何一种程序都可以实现对Excel的操作。

l 与其他计算机上的应用程序通讯;

实际为COM接口与接口之间的通讯,因其实现了不同语言、不同计算机的方式,所以实现不同计算机上应用程序的通讯也就十分容易。

COM模块:

COM的模块指独立的应用程序(EXE)或者动态连接库(DLL),在实现COM时,采用DLL方式要比较容易一些。因为:应用程序在加载时在内存中都是独立的地址控件,而DLL加载后可以驻留内存。当多个客户端调用COM时,如果采用EXE形式,就会有多个EXE被加载,而且COM处理客户端的访问时,也必须在不同的地址空间来回切换,大费周张。而DLL形式永远只有一个驻留内存,COM只要在相同的内存空间中寻找执行代码即可。

逐步深入:

DLL我们都已经写了很多,通常我们写的DLL都是定义的一些方法或是过程来实现特定的操作,当然定义的出口(Exports)也就是这些方法或是过程。现在我们来写一个出口为一个类的DLL来展开我们COM编写的学习。

准备工作:

打开Delphi,选择File\New\Others,选择DLL Wizard自动创建一个DLL工程,选择File\New\Unit新建一个单元,全部保存。

写代码:

在新建的Unit中定义一个抽象类:

Type

TCalculator=Class

Public

Function Addition (Op1, Op2: Double): Double ; virtual; abstract;

End;

这个类很简单,就定义了一个抽象方法实现两个数的相加。

定义抽象类后,定义一个类来实现这个抽象类:

Type

TCalcImple=Class (TCalculator)

Public

Function Addition (Op1, Op2: Double): Double; Override;

End;

方法实现:

Function TCalcImple.Addition(Op1, Op2: Double): Double;

Begin

Result: =Op1+Op2;

End;

当然我们还差一个创建这个类的方法,我们在加入如下:

Function CreateCalcImple:TCalcImple;stdcall;

Begin

Result:=TCalcImple.Create;

End;

定义出口:

Exports CreateCalcImple;

这样我们这个DLL的编写就完成了,我问再来写一个Exe程序来调用它。具体在此就不再操作以便,一些列出Exe的源代码:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

{定义与DLL中定义的抽象类一样的类,类名称可以自定}

Type

TCalculator=Class

Public

Function Addition(Op1,Op2:Double):Double;virtual;abstract;

End;

type

TForm1 = class (TForm)

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

v_Obj:TCalculator;

end;

{静态调用DLL,注意返回类型与DLL中的不同,为抽象类的名称必须与DLL中的一致}

Function CreateCalcImple:TCalculator;stdcall;External 'ComDLL.dll';

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

v_Obj:=CreateCalcImple;

Edit3.Text:=FloatToStr(v_Obj.Addition(StrToFloat(Edit1.Text),StrToFloat(Edit2.Text)));

v_Obj.Free;

end;

end.

升华到理论:

l D L L中定义的对象只能引出抽象方法。当建立对象时, D L L向应用程序返回虚拟方法的指针表VTable。

l 在定义抽象类的时候,定义的方法为:

Function Addition(Op1,Op2:Double):Double;virtual;abstract;

后面加上abstract(抽象方法表示)的原因是因为只有抽象方法才能被引出。

l 在执行文件中,通过DLL的出口实际只创建了一个接口,但是可以像使用对象一样来调用其方法,这就有点开始尽是于COM了。

有上面几点引出:

1、COM的接口可以看成一个占位符,具体的实现是在接口对应的类中;就像我们定义的抽象类(TCalculator)中的Addition方法,只是一个没有任何意义的描述符,但通过实现类(TCalcImple)中引出后便有了具体的意义;

2、COM接口的访问必须通过其接口类进入后才能够访问。就如我们例子中加入CreateCalcImple方法一样,只有建立这个接口类(Interface)后才可以访问具体的接口。

3、也就是说,一个COM必须具备三个方面的元素:接口定义类、接口实现类、接口创建类。只要具备了这三个方面的元素就可以实现COM。

(待续…)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有