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

原创 2004年06月13日 16:08:00

COM程序编写入门

编写:李贤敏<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

日期:<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2004-5-2

名词解释:

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

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

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

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

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

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

l        创建ActiveX控件;

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

如:Microsoft ExcelOLE编程接口,创建对象后,任何一种程序都可以实现对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

 

(待续…)

2016年兰州交通大学校园选拔赛

时间:2016.11.27   9:00——12:00 OJ系统:PTA(感谢陈越姥姥提供竞赛平台~) 成绩:144/220(分数/总分) 自我评价:及格,打个分数的话,60%吧......今天状...
  • flx413
  • flx413
  • 2016年11月27日 19:28
  • 2627

推荐几款COM组件开发的入门书籍

推荐几本个人读过的比较不错的COM组件相关的书籍,按我的阅读感受排名如下: 1,《Visual C++实践与提高-COM和COM+篇》         这本书我放在第一位,倒不是它有多么出色,但...
  • ghevinn
  • ghevinn
  • 2014年01月25日 17:37
  • 6598

Shell编程入门总结(一)

本文的主要内容: 1、编写Shell脚本的一般步骤 2、在Shell脚本中输出文本 3、Shell脚本中的变量 4、Shell脚本中的函数 5、流程控制:if 分支结构 6、Shell中读取键盘输入...
  • CSDN_SXL
  • CSDN_SXL
  • 2016年04月28日 21:55
  • 5311

Lucene&Solr(之一)-全文索引、入门程序

什么是全文检索 1、生活中的数据类型分成: a、结构化数据:类型固定、格式固定、有限长度的数据。如数据库中的数据 b、非结构化数据:格式不固定、长度不固定的数据。如txt文档、word文档和ex...
  • LLLLLiSHI
  • LLLLLiSHI
  • 2017年04月27日 15:06
  • 216

Com入门1

最近需要用到COM知识,总结一下刚学到的知识。 1. 什么是COM COM全称是Component Object Model,中文译为组件对象模型。COM组件在物理上是一些DLL或EXE文件;...
  • hhhbbb
  • hhhbbb
  • 2012年06月05日 09:51
  • 401

COM编程入门(1)

原文地址:http://www.cppblog.com/mzty/archive/2005/12/23/2003.html   COM编程入门 第一部分 什么...
  • FoxBryant
  • FoxBryant
  • 2012年05月09日 23:29
  • 504

Windows桌面应用程序(1-2-3-2nd) 初始化COM库

任何使用COM的Windows程序都必须通过调用CoInitializeEx函数来初始化COM库。每个使用COM接口的线程都必须分别调用这个函数。CoInitializeEx具有以下签名: HR...
  • qq_37422196
  • qq_37422196
  • 2018年01月07日 21:03
  • 33

《MFC Windows程序设计》第18章(1):COM

1、 COM
  • milanleon
  • milanleon
  • 2014年08月05日 10:43
  • 924

ANDROID入门1:在Ubuntu上为Android系统编写Linux内核驱动程序

转自:http://blog.csdn.net/luoshengyang/article/details/6568411   在智能手机时代,每个品牌的手机都有自己的个性特点。正是依靠这种与众不同...
  • joqian
  • joqian
  • 2013年04月02日 11:21
  • 565

[zx.uuzu.com]3D游戏程序设计入门DirectX9.0

  • 2012年02月13日 17:43
  • 5MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM程序编写入门(全文-1)
举报原因:
原因补充:

(最多只允许输入30个字)