创建基于DLL的COM
COM(Component Object Model )也就是组件对象模型,这个名
字的更多的来自于硬件接口的含义,但是,这个接口是软件上的。
COM 是一种用于说明如何建立软件组件的规范,由于使用了统一
的接口规范,不同的开发人员创建的COM 组件,可被组合进不同的应
用程序中,而且这些COM 组件所使用的语言,可以是完全不同的。
这对于一个开发软件的集体来说,是有很大的意义的。
DCOM(Distributed Component Object Model)分布式组件对象
模型,这是一种分布式应用程序集成到网络的技术,一个分布式应用
程序由多个进程组成,这些进程协作完成一项工作。
DCOM为COM 组件之间的通信透明的提供可靠、安全和有效的支持
,这些组件包括ActiveX ,脚本和Java小程序。
DCOM可将其应用程序分布到最适合于其顾客和应用程序的位置。
下面通过一个例子,说明COM组件的构造方法。
1〉新建ActiveX库
file -> new -> other -> ActiveX -> ActiveX Libray
OK
产生一个项目文件
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
2〉创建COM对象
File -> new ->Other ->ActiveX ->COM object
OK
类对话框:
输入类名:比如MyShow
出现一个统一的类生成器:
IMyShow ----接口
MyShow ----实现这个接口的对象
在IMyShow 右键 -〉New -> Property
添加一个属性,Name名字起为:Name
再添加一个方法:Method
Name名字起为:HelloName
关于属性,一般的形式是:
protected
function Get_name: WideString;
stdcall;
procedure Set_name(const Value: WideString);
stdcall;
end;
....
function TMyShows.Get_name: WideString;
begin
end;
procedure TMyShows.Set_name(const Value: WideString);
begin
end;
也就是说返回的是function,进入的是procedure。当使用字符串
的时候(WideString),对应的为BSTR。
为了达到这个目的,在建立属性的时候,要注意:
Get:Type->BSTR
Parameters->删除
set: Type->Void
Parameters->Value BSTR [in]
这样就能造成上面的效果。
refresh--->刷新
形成程序的框架,并在框架中写入自己的内容:
具体处理的程序可以这样写:
var Username:string;
function TMyShows.Get_name: WideString;
begin
Result := WideString(Username);
end;
procedure TMyShows.Set_name(const Value: WideString);
begin
Username := String(Value);
end;
关于方法,去掉返回值就是过程,否则是函数:
procedure TMyShows.helloName;
begin
messagebox(0,Username,Username,mb_ok)
end;
这里要注意一个问题,messagebox(0,'','',mb_ok)和showmessage('')
需要Dialogs 库,需要把它Uses进来。
完成的源程序如下:
--------------------------------------------------------------
unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl,Dialogs;
type
TMyShows = class(TTypedComObject, IMyShows)
protected
function Get_name: WideString;
stdcall;
procedure Set_name(const Value: WideString);
stdcall;
procedure helloName;
stdcall;
end;
implementation
uses ComServ;
var Username:string;
function TMyShows.Get_name: WideString;
begin
Result := WideString(Username);
end;
procedure TMyShows.Set_name(const Value: WideString);
begin
Username := String(Value);
end;
procedure TMyShows.helloName;
begin
showmessage('您的名字是:'+ Username);
end;
initialization
TTypedComObjectFactory.Create(ComServer, TMyShows, Class_MyShows,
ciMultiInstance, tmApartment);
end.
----------------------------------------------------------------
File -> Save all 保存
Project -> Build 编译
Run -> Register ActiveX Server 注册
在Delphi中调用COM组件的方法
1)调入COM库:
Project -> Import Type Library
Add -> 该Dll
Create Unit 加入一个关于这个组件单元,这里是Project1_TLB。
file -> Use Unit -> Project1_TLB 把这个库单元加入到当前库中,
注意这里多了一句:uses Project1_TLB;
把Uses补齐,并且定义一个对象变量:
uses Project1_TLB,Comobj,Activex;
var m:MyShows;
在加入form时,要建立一个对象的实例:
procedure TForm1.FormCreate(Sender: TObject);
begin
m:= CoMyShows.Create;
end;
写出两个使用这个对象Button事件:
procedure TForm1.Button2Click(Sender: TObject);
begin
m.Set_name(string(edit1.Text));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
m.helloName;
end;
看看效果。
完成的COM组件是可以在任何语言系统下使用的,你可以在VB下做个实验,
效果应该是完全一样的。