预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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