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

名词解释:

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必须具备三个方面的元素:接口定义类、接口实现类、接口创建类。只要具备了这三个方面的元素就可以实现
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值