博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Delphi中使用Queued 组件 (转)
阅读量:2499 次
发布时间:2019-05-11

本文共 3004 字,大约阅读时间需要 10 分钟。

在Delphi中使用Queued 组件 (转)[@more@] 

在中使用Queued Components:namespace prefix = o ns = "urn:schemas--com::office" />

队列(Queued Components)是一项基于消息队列服务(Microsoft Message Queuing Services)的COM+技术。它提供了一种简易的异步引用和组件的方法。发送方和接收方都不心考虑对方现在是否可用和能否获得而独立运行。

作为一项COM技术。队列指的是用于消息以便将来检索的空间。队列提供了一种非连接性的通讯机制(即发送方和接怍方之间并不是直接相连结,而是通过队列进行相互通讯)。队列负责存储信息直到接收方准备好为止。由于发送方和接收方之间不是直接通讯的,所以可以相互之间独立地运行,而不会影响到双方。

下面举例说明如何使用Delphi创建和使用队列组件。

首先,我们将创建一个。接口中的所有方法必须仅使用IN参数,不能有返回值。这是由于客户端和服务器之间并没有直接的连结。因为不能确切地知道请求什么时候会被执行,所以客户端不能一直等待从服务器获得应答。

在Delphi中,首先打开file/new/other/,创建一个ActiveX Library,然后,加入一个automation。为你的服务器对象取一个名称,比如QdComponent,其他的选项都使用默认值,单击OK.这时你将会看到Type Library Editor,添加一个方法,命名为Task1,为这个方法添加一个参数,命名为TaskMessage,设定其类型为BSTR(即Delphi中的WString类型)。如果Type Library Options设置为show Pascal code,那么你的方法声明代码应与以下代码类似:

procedure task1(TaskMessage:widestring) [dispid $00000001];safecall;

保存项目为MyQdServer,单元文件为QdServer.

具体代码如下:

unit QdServer;

{$WARN SYMBOL_PLATFOOFF}

interface

uses comobj,ActiveX,MyQdServer_TLB,stdvcl,Dialogs;

type

  TqdComponent=class(Tauto,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不是默认的 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),找到你的服务器,右击选择启动。

#这是我的第一份翻译作品,请不吝赐教。

 

 

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-975748/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-975748/

你可能感兴趣的文章
自动将脚本放在页面底部
查看>>
队列课下作业
查看>>
软件开发基本原则(二)—— 典型错误 (转)
查看>>
spring jpa 实体互相引用返回restful数据循环引用报错的问题
查看>>
SQL server 2008数据库的备份与还原(转)
查看>>
设计模式(二)
查看>>
Ubuntu 13.10 下安装node
查看>>
团队项目成员与题目(本地地铁查询app)
查看>>
codeforce 356 A. Knight Tournament(线段树覆盖,3级)
查看>>
MySQL自学笔记5--表联合、表连接、视图、字符集、校对集
查看>>
python3 中的try 异常调试与 raise 异常抛出
查看>>
关于md5加密
查看>>
python爬虫小实例
查看>>
查看日志
查看>>
静态文件---访问图片
查看>>
费用流模板
查看>>
Xcode And iOS9新特性
查看>>
问题 C: 质因数的个数
查看>>
Linux iptables开放端口
查看>>
传输层(最重要)
查看>>