Delphi下的COM编程技术 - 1

一、建立 COM 对象

File ”菜单上的“ New ”命令,翻到“ ActiveX ”页,然后双击“ COM Object ”图标。


Delphi下的COM编程技术 - 1

具体方法如下:

   1 、在“ Class Name ”框内输入 C0M 对象的类名,不必以 T 打头。

2 、在“ Instancing ”框内指定 COM 对象的实例模式。对于 InProcess 类型的服务器来说不必指定实例模式。

   3 、在“ Threading Model" ,柜内选择一种线程模式,可以设为以下值:

    Single :整个 COM 服务器都是单线程的

    Apartment :每个 COM 对象的实例有单独的线程。这样,凡是需要共享的数据 ( 诸如全局变量 ) 必须用线程同步对象保护;

    Free :一个 COM 对象的多个实例可以同时运行,这意味着 COM 对象必须保护自己的实例数据,以避免多个实例相冲突:

    Both :同时支持 Apartment Free 两种线程模式。

  在“ Implemented Interfaces ”框内输入让 COM 对象实现的接口名称 ( 可选 ) 。默认情况下向导所创建的 COM 对象只实现 IUnknown 接口。如果选中“ Include Type Library 复选框,向导将生成一个类型库。

  如果选中“ Mark interface OleAutomation 复选框,将使接口支持 Ole Automation 。不过,类型库中的数据类型必须是与 Ole Automation 兼容的类型。单击“ OK ”按钮,向导将创建一个 COM 对象。如果选中丁“ Include Type Library 复选框,向导将创建 1 个类型库。同时,向导将生成 COM 对象的单元文件。


Delphi下的COM编程技术 - 1

点击“OK”按钮后,生成的代码如下:

unit UmyTest; {$WARN SYMBOL_PLATFORM OFF} interface uses Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl; type TMyTest = class(TTypedComObject, IMyTest) protected {Declare IMyTest methods here} end; implementation uses ComServ; initialization TTypedComObjectFactory.Create(ComServer, TMyTest, Class_MyTest, ciInternal, tmApartment); end.


接口对象是一个类,但保留字 class 后列出了两个祖先 :

第一个祖先必须是 TObject 的派生类,这里是 TTypedComObject;

第二个祖先是要实现的接口,这里是 IXXH

第一个祖先可以是其他已声明过的接口对象,表示正在声明的接口对象同时支持多个接口。接口的第一个成员必须是 CLSID 。在某些需要传递 CLSID 常量的场合.可以直接用接口名称来代替 CLSID 常量。当然,目前 IXXH 接口中还没有其他成员。

   COM 对象的实例是通过类工厂来建立的。每个 COM 对象都有一个类工厂。类工厂本身的实例是在单元的 initialization 部分建立的。这样,一旦 COM 服务器调入内存运行,就会创建类工厂的实例,也就随时可以根据客户的请求创建 COM 对象的实例。

  要让 Windows 能找到 COM 服务器, COM 服务器必须在 Windows 的注册表中登记注册。

这需要借助于一个叫 Regsvr32.exe 的命令行程序。