|
队列组件(Queued Components)是一项基于微软消息队列服务(Microsoft Message Q ueuing Services)的COM+技术。它提供了一种简易的异步引用和执行组件的方法。 发送方和接收方都不心考虑对方现在是否可用和能否获得而独立运行。 作为一项COM技术。队列指的是用于存储消息以便将来检索的空间。队列提供了一种 非连接性的通讯机制(即发送方和接怍方之间并不是直接相连结,而是通过队列进行相 互通讯)。队列负责存储信息直到接收方准备好为止。由于发送方和接收方之间不是直 接通讯的,所以可以相互之间独立地运行,而不会影响到双方。 下面举例说明如何使用Delphi创建和使用队列组件。 首先,我们将创建一个服务器。接口中的所有方法必须仅使用IN参数,不能有返回值。 这是由于客户端和服务器之间并没有直接的连结。因为不能确切地知道请求什么时候会 被执行,所以客户端不能一直等待从服务器获得应答。 在Delphi中,首先打开file/new/other/activeX,创建一个ActiveX Library,然后,加入 一个automation对象。为你的服务器对象取一个名称,比如QdComponent,其他的选项都 使用默认值,单击OK.这时你将会看到Type Library Editor,添加一个方法,命名为Tas k1,为这个方法添加一个参数,命名为TaskMessage,设定其类型为BSTR(即Delphi中的Wi deString类型)。如果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 applc ation”根据提示找到你的新程序,右击它,转到属性页,找到Queuing栏,选择复选框 中的两项1.Queued 2.Listen.Listen表示任何被压入队列的消息,当它被击活时,将 马上被处理。在你的新程序下右击“components”选择New/Component,选择“install new component(s)”,根据提示,找到并安装你的DLL文件,然后展开文件树找到“inte rface”,右击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‘CoGetOj ect’ 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),找到你的服务器,右击选择启动。
|
[浏览:
次]
|