Delphi中COM 实现研究手记(一)

2008-04-09 04:22:12来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

前些日子用 Delphi 写了一个 Windows 外壳扩展程序,大家知道 Windows 外壳扩展实际上就是 COM 的一种应用 -- Shell COM,虽然整个程序写得还算比较顺利,但写完后还是感觉对 Delphi 中 COM 的实现有点雾里看花的感觉,因此我认为有必要花一点时间对 COM 在 Delphi 中的实现做一些研究。另外我也买了李维的新书 --《深入核心 -- VCL架构剖析》,里面有两章涉及了与 COM 相关内容,看完后我知道了COM 在 Delphi 中的实现是基于接口(Interface),而 Delphi 中的接口概念又起源于对 COM 的支持,总之他们之间互相影响,发展成接口在 Delphi 中已经是 First-Class 的地位,并且完全摆脱 COM 而独立存在。
本系列文章侧重于描述 COM 在 Delphi 中的实现手法,主要配合 VCL 源码片断进行分析,不会涉及过多的基本概念,因此要求读者有一定的 COM 和 接口概念,可以参考我在文章末尾列出的文献。本篇主要讲 COM 对象在 Delphi 中的创建过程。

正文
为了让读者能跟着我的分析轻松读完本篇文章,我引用文献[2]中的范例做解释,但为了更清楚地阐述问题,我改写了部分代码。所有分析请在 Delphi 7 上测试。Demo 源码这里
下载
Delphi 中首先通过选择菜单 File-->New-->Other...新建一个 ActiveX Library 并保存名称为 SimpleComServer,再新建一个 COM Object,在COM Object Wizard 中将对象命名为 SimpleCOMObject,Options 中的两个复选框都可以不必选中其他的保持默认, 现在 COM服务器端的框架已经建立起来了。剩下的就是需要我们把声明的接口 ISimpleCOMObject 的代码实现,其他的读者自己看源码吧,很简单。

服务器端代码

library SimpleComServer;

uses
ComServ,
SimpleCOMObject
in ''''SimpleCOMObject.pas''''
,
SimpleComInterface
in ''''SimpleComInterface.pas''''
,

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;

{$R *.RES}

begin
end
.


unit SimpleComInterface;

interface
uses
Windows;
const
Class_SimpleComObject: TGUID = ''''{3714CF21-D272-11D3-947F-0050DA73BE5D}''''
;

type
ISimpleComObject =
interface
[''''{2E2A6DD0-D282-11D3-947F-0050DA73BE5D}''''
]
function Multiply(X, Y: Integer): Integer; stdcall
;
function GetClassName: Widestring; stdcall
;
end
;

implementation

end


unit SimpleCOMObject;

interface

// SimpleCOMObject

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:如何使程序在运行时自动注册ActiveX控件

下一篇:发掘ListBox的潜力(二):鼠标拖放插入点提示