[摘要]队列组件(Queued Components)是一项基于微软消息队列服务(Microsoft Message Queuing Services)的COM+技术。它提供了一种简易的异步引用和执行组件的方法。发送方和接收方都不心考虑对方现在是否可用和能否获得而独立运行。作为一项COM技术。队列指的是用...
队列组件(Queued Components)是一项基于微软消息队列服务(Microsoft Message Queuing Services)的COM+技术。它提供了一种简易的异步引用和执行组件的方法。发送方和接收方都不心考虑对方现在是否可用和能否获得而独立运行。
作为一项COM技术。队列指的是用于存储消息以便将来检索的空间。队列提供了一种非连接性的通讯机制(即发送方和接怍方之间并不是直接相连结,而是通过队列进行相互通讯)。队列负责存储信息直到接收方准备好为止。由于发送方和接收方之间不是直接通讯的,所以可以相互之间独立地运行,而不会影响到双方。
下面举例说明如何使用Delphi创建和使用队列组件。
首先,我们将创建一个服务器。接口中的所有方法必须仅使用IN参数,不能有返回值。这是由于客户端和服务器之间并没有直接的连结。因为不能确切地知道请求什么时候会被执行,所以客户端不能一直等待从服务器获得应答。
在Delphi中,首先打开file/new/other/activeX,创建一个ActiveX Library,然后,加入一个automation对象。为你的服务器对象取一个名称,比如QdComponent,其他的选项都使用默认值,单击OK.这时你将会看到Type Library Editor,添加一个方法,命名为Task1,为这个方法添加一个参数,命名为TaskMessage,设定其类型为BSTR(即Delphi中的WideString类型)。如果Type Library Options设置为show Pascal code,那么你的方法声明代码应与以下代码类似:
procedure task1(TaskMessage:widestring) [dispid $00000001];safecall;
保存项目文件为MyQdServer,单元文件为QdServer.
具体代码如下:
unit QdServer;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses comobj,ActiveX,MyQdServer_TLB,stdvcl,Dialogs;
type
TqdComponent=class(TautoObject,IQdComponent)
Protected
Procedure Task1(const TaskMessage:widestring);safecall;
End;
Implemention
Uses comServ;
Procedure TqdComponent.Task1(const TaskMessag:widestring);
Begin
Showmessage(TaskMessage);
End;
Initialization
TautoObjectFactory.Create(ComServer,TqdComponent,class_QdComponent
CiMultiInstance,tmApartment);
End.
安装服务器
在控制面板中打开组件服务工具(Component Services Tool),在文件树中找到”COM+ Application”,然后右击,选择New/Application接着选择“Create an empty applcation”根据提示找到你的新程序,右击它,转到属性页,找到Queuing栏,选择复选框中的两项1.Queued 2.Listen.Listen表示任何被压入队列的消息,当它被击活时,将马上被处理。在你的新程序下右击“components”选择New/Component,选择“install new component(s)”,根据提示,找到并安装你的DLL文件,然后展开文件树找到“interface”,右击IqdComponent,打开属性页,在Queuing栏中选上”Queued”(如果看到出错提示信息“MSMQ IS NOT RUNNING”)那么很可能你没有安装MSMQ,因为MSMQ不是默认的WINDOWS 2000的安装选项。
创建客户端
创建一个新的Delphi应用程序,在uses子句中加入MyQdServer_tlb.pas单元文件,添加一个按钮和一个文本框。
你需要在程序运行时创建你的对象,所以使用一个符号变量来标记组件的信息,这个参数在FormShow事件处理函数中声明和使用。
具体代码如下:
unit unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,Comobj,ActiveX,MyQdSever_TLB,
Type
Tform1=class(TForm)
Edit1;Tedit;
Button1:Tbutton;
Procedure Button1Click(sender:Tobject);
Procedure FormShow(sender:TObject);
Private
Qinterface:IqdComponent;
Public
{Public declarations}
end;
var
form1:Tform1;
implemention
{$R*.dfm}
Function NewCoGetObject(pazName:PwideChar;pBindOptions:PbindOpts;
Const iid:TIID;out ppv):Hresult;stdcall;external ‘ole32.dll’ name‘CoGetOject’
Procedure Tform1.Button1Click(sender:TObject);
Begin
Qinterface.task1(edit1.text);
End;
Procedure Tform1.FormShow(sender:Tobject);
Var
Qmoniker:PwideChar;
Begin
Qmoniker:=’Queue:/new{服务器的GUID或Server.interfaceName}’;
Olecheck(NewCoGetObject(Qmoniker,nil,IqdComponent,Qinterface));
End;
End.
运行客户端程序,然后传送一条消息,由于此时你并没有启动服务器,所以这时并不能显示出来这条消息,需要启动服务器,而最简单的方法就是打开控制面板中的组件服务(Component Services),找到你的服务器,右击选择启动。
……