资源描述:
《Delphi 中 COM 实现研究手记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Delphi中COM实现研究手记前言 前些日子用Delphi写了一个Windows外壳扩展程序,大家知道Windows外壳扩展实际上就是COM的一种应用--ShellCOM,虽然整个程序写得还算比较顺利,但写完后还是感觉对Delphi中COM的实现有点雾里看花的感觉,因此我认为有必要花一点时间对COM在Delphi中的实现做一些研究。另外我也买了李维的新书--《深入核心--VCL架构剖析》,里面有两章涉及了与COM相关内容,看完后我知道了COM在Delphi中的实现是基于接口(Interface),而De
2、lphi中的接口概念又起源于对COM的支持,总之他们之间互相影响,发展成接口在Delphi中已经是First-Class的地位,并且完全摆脱COM而独立存在。 本系列文章侧重于描述COM在Delphi中的实现手法,主要配合VCL源码片断进行分析,不会涉及过多的基本概念,因此要求读者有一定的COM和接口概念,可以参考我在文章末尾列出的文献。本篇主要讲COM对象在Delphi中的创建过程。正文 为了让读者能跟着我的分析轻松读完本篇文章,我引用文献[2]中的范例做解释,但为了更清楚地阐述问题,我改写了部分代码
3、。所有分析请在Delphi7上测试。Demo源码这里下载。 在Delphi中首先通过选择菜单File-->New-->Other...新建一个ActiveXLibrary并保存名称为SimpleComServer,再新建一个COMObject,在COMObjectWizard中将对象命名为SimpleCOMObject,Options中的两个复选框都可以不必选中其他的保持默认,现在COM服务器端的框架已经建立起来了。剩下的就是需要我们把声明的接口ISimpleCOMObject的代码实现,其他的读者自己看源
4、码吧,很简单。服务器端代码librarySimpleComServer;uses ComServ, SimpleCOMObjectin'SimpleCOMObject.pas', SimpleComInterfacein'SimpleComInterface.pas',exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;{$R*.RES}beginend.unitSimpleComInterfac
5、e;interfaceusesWindows;const Class_SimpleComObject:TGUID='{3714CF21-D272-11D3-947F-0050DA73BE5D}';type ISimpleComObject=interface ['{2E2A6DD0-D282-11D3-947F-0050DA73BE5D}'] functionMultiply(X,Y:Integer):Integer;stdcall; functionGetClassName:Widestring
6、;stdcall; end;implementationendunitSimpleCOMObject;interface//SimpleCOMObject的实现部分uses Windows,ActiveX,Classes,ComObj,SimpleComInterface;type TSimpleComObject=class(TComObject,ISimpleComObject) protected functionMultiply(X,Y:Integer):Integer;stdcall; fu
7、nctionGetClassName:Widestring;stdcall; end;const Class_SimpleComObject:TGUID='{3714CF21-D272-11D3-947F-0050DA73BE5D}';implementationusesComServ;{TSimpleComObject}functionTSimpleComObject.GetClassName:Widestring;begin Result:=TSimpleComObject.ClassName;end;f
8、unctionTSimpleComObject.Multiply(X,Y:Integer):Integer;begin Result:=X*Y;end;initialization TComObjectFactory.Create(ComServer,TSimpleComObject,Class_SimpleComObject, 'SimpleComObject','Asimpleimpleme