

Delphi中的COM应用
- 期刊名字:计算机时代
- 文件大小:145kb
- 论文作者:雷孝平
- 作者单位:山东经济学院研究生部
- 更新时间:2020-06-12
- 下载次数:次
Computer Era No 10 2002Delph中的COM应用雷孝平(山东经济学院研究生部,山东济南250014)摘要:COM技术并不特定于某种编程语言。本文以 Delphi为例,解释了在 Delphi中COM的几个基本要素是怎么实现的,并举例说明。关键字: Delphi;COM;接口;GUID;类工厂COM( Component Object Model,组件对象模型)是生成的每个COM组件和接口,并向操作系统和其他软件惟一Microsoft生成软件组件的标准,可以将它比喻成一个规则簿,标识这个组件。对组件或接口进行任何改变时,就产生新的如果遵守COM规则,那么你的软件能够与其他组件交换信息,GUID。GUD是个128位整数现在还没有一种编程语言能够实现软件组件在二进制上的兼容性。通俗地说,COM提供了一支持128位的整数, Object Pascal中用一个叫TGUD的记录种比较低层次的对象绑定机制,只提供对象间彼此通信的能来代表GUID,声明如下:力。COM技术并不特定于某种编程语言,只要遵循同样的接typ口,可以用C++、 Pascal、 Basic等不同语言实现。那么在 DelphiPGUID=中是怎么实现COM的呢?TGUID ED1: LongWord1 Delph中的接囗Delphi3开始引入的 Interface关键字可以让我们轻松声D3: Word明COM接口。声明接口非常类似于声明一个类但接口只有属D4: array[o.7] of Byte性和方法而没有数据,而且接口并不实现自己,我们只能通过类来实现接口,并通过创建实现接口的类的对象来得到一个接由于以这种记录方式为变量和常量赋GUID值非常麻烦,口的实例。接口的释放也有特殊性:无论在接口上调用Fe或因此 Object Pascal允许用以下格式的字符串来表示TGUD者 Release方法都会引起非法访问!在 Delph中,释放接口的正(xXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX确方法是将接口指针置为nl,这会自动调用 Release的COM这样,对 Delphi编译器来说,下面两种声明是等效的:方法。而且, Delphi会自动为我们跟踪COM对象在它过期时Ny Guid: TGuid=(01:$12345678;D2:$1234;D3:$1234将它释放所以我们不必关心COM对象的释放问题D4:($01,$02,$03,$04,$05,$06,$07,$08)所有的COM接口都是从 IUnknown接口继承而来。 Delphi My Guid:Toud=123456781234-1234-12345678}中,Unknown的声明如下:3类工厂为了得到COM对象的实例,我们需要为此COM对象实现类工厂。 Delphi中,类工厂支持 IClassFactory接口,它的声明r0oo0000o000o0c0o00000o0oo46yfunction Queryinterface(const lID: TGUID: out obj):Integer; stdcall;IClass Factory interface(IUnknown)function AddRef: Integer; stdcallr00o0001-0000000c000000000006yfunction Release: Integer; stdcallfunction Createinstance(const unkOuter: IUnknown; constid: TIID: out obj): HResult: stdcall;可以看到, IUnknown声明了三个方法: QueryInterfaceO,function Lock Server(f Lock: BOOL): HResult; stdcaAddRefo和_ Released。因为 IUnknown是COM对象的基本接口,所以所有的接口都必须实现这三个方法,这可以用手工完注的田且剑建一个和类工厂相关联的成也可以让vCL来代劳只要使类从 TInterfaceObject继承就coM中国煤化工以控制这个对象的接口的可以了。CNMHG口的指针。值得注意的是我们永远不能通过接口来实现接口,只能通Delphi提供了两个类来封装COM对象和类工厂:TCo过类来实现。mobject和 TComObjectFactory。 TComObject包含了对Un2 GUIDkown和 TComObject创建的实例的支持; TComObjectFactory万方数捨 nique identifier,全局惟一标识符被赋予支持 Class Factory接口,并能够创建 TComObject类的实例。GUID(Globally计算机时代2002年第10期4一个COM的具体例子begin当实现一个COM应用时,应该提供以下内容:Len : MAX COMPUTERNAME LENGTH 1cOM接口:暴露给客户的服务接口,以便客户知道GetMem(S, Len)COM对象都提供了哪些服务;COM服务器:包含COM对象代码的模块,一个COMResult: S对象可以实现多个接口;raise Exception. Create(Could not get computer name. )COM客户:调用接口以便获得COM服务器提供的服务客户端知道要获得哪种服务,但不知道cOM服务器位于何这样就实现了 GetName方法(6)编译并保存我们的工程然后点击Run菜单中的下面我们就来实现一个简单的例子。我们创建一个进程内ctive Server,以便在系统中注册我们的COM服务器。的COM服务器,它可以取得计算机的名称这项服务通过接口这样COM服务器就创建完成了。我们可以发现 Delphi给GetName来公布我们生成的文件中有 P SrvcDLL tlb, P_SrvcDLL_TLB. p1)创建GOM服务器P SrvcDLL, dl,其中, P SrvcDLL, tb是类型库(可包含多个接打开 Delphi5,进行以下操作口)文件, P_SrvcDLL_TLB. pas是类型库的源文件,包含了(1)选 FileI Close All-关闭所有项目TsystemHelp和其他几个重要的类的声明 P SrvcDLL dll就是(2) File INew选 ActiveX页中的 ActiveX Library,这可以我们的COM服务器了。让 Delphi为我们生成cOM服务器代码所在的模块,这是一个2)创建cOM客户DLL,把它以名字 P SrVcDLL保存;在Deph5中新建一个工程,在窗体上放置一个 Label,3)Fe|New双击 ActiveX页中的CoMO图标,此个Edt,一个 Button.。以 U_Client和 P_Client为名保存单元和时出现 COM Object wizard,我们在 ClassName中填入工程。然后点击 Project菜单中的 Add To Project.,选项把SystemHelp,保留 Instancing和 Threading Model的默认选项P SrvcDLL TLB添加到工程中来,在窗体对应的单元的UesDescription填入“ COM Programming in Delphi is so easy子句中添加 P SrvcDLL TLB,这样我们就可以使用刚才创建点击“OK”,此时出现 Type Library Editor,在这里我们可以编的COM服务器了。为窗体类 TForml添加私有变量Fsys辑COM对象暴露给它的客户的接口。在左边可以看到, Delpht temHelp: ISystemHelp,然后双击窗体上的Buon,为它的单击给我们列出了接口和实现这个接口的类的名称。现在,我们在事件编写如下代码ISystemHelp”上点击右键,选择 New I Method,为接口添加方procedure TForm1. Button 1Click(Sender: TObject)法, Delphi把这个方法命名为 Method,我们把它改为GetName,然后点击右边的 Parameters页签,为 Return Type选FSystemHelp: CoSystemHelp Create取LPSTREdit1. Text FSystemHelp GetNam4)关闭 Type Library Editor,以USrc的名字保存刚刚生成的 UnitI单元类 CoSystemHelp由 Delphi自动生成,它的声明在单元(5)在U_Svc单元中, Delphi给我们生成的 TSystemHelp P_ SrVcDLL TLB中,它的 Create方法借助同一单元中声明的的声明如下:ISystemHelp的ⅢD来生成了所需要的COM对象然后调用这TSystemHelp= class(TTypedComobject, ISystemHelp个COM对象的 GetName方法来得到了计算机的名称。最后保存并运行我们的工程,点击窗体上的Butn后,我function GetName: PChar: stdcall们发现计算机的名称已经出现在Edit中了,这说明我们的客户和COM服务器已经很好的开始工作了。可以看到, TsystemHelp从 TType Comobject继承而来,并参考文献实现了接口 ISystemHelp;编辑 U Svc单元中 renAme方法为(1潘爱民COM康理与用,隋隼幽社,199如下代码:[2] Charlie Calvert. Delphi 4 Unleashed. Sams Publishing, 1999function TSystemHelp GetName: PChar;[3] Steve Teixeira, Xavier Pacheco. Delphi 5 Developers GuideLen: DWord4]中国煤化工Shepherd. ProgrammingS: PCharCNMHG C.欢迎订阅欢迎来稿欢训刊堂广告
-
C4烯烃制丙烯催化剂 2020-06-12
-
煤基聚乙醇酸技术进展 2020-06-12
-
生物质能的应用工程 2020-06-12
-
我国甲醇工业现状 2020-06-12
-
JB/T 11699-2013 高处作业吊篮安装、拆卸、使用技术规程 2020-06-12
-
石油化工设备腐蚀与防护参考书十本免费下载,绝版珍藏 2020-06-12
-
四喷嘴水煤浆气化炉工业应用情况简介 2020-06-12
-
Lurgi和ICI低压甲醇合成工艺比较 2020-06-12
-
甲醇制芳烃研究进展 2020-06-12
-
精甲醇及MTO级甲醇精馏工艺技术进展 2020-06-12