中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>代码分析>文章内容

delphi 在Delphi中使用Queued Components

来源:网络 关于:轶名 发布时间:2007-07-02   [收藏] [推荐]
队列组件(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),找到你的服务器,右击选择启动。

[浏览: 次]   
上一篇:delphi 使用 IStream   下一篇:delphi Delphi_如何在Delphi中用代码来完成计算字段的创建
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi_动态数组介绍----Delphi
·delphi 检查IP地址
·delphi DBExpress 提高
·delphi 复制Excel列到二维数组
·delphi Delphi_VCL消息处理机制的内幕
·delphi 产生不重复的随机数
·delphi 如何在DELPHI里调用MS office
·delphi 缓冲池
·delphi MIDAS——多层分布式应用程序服
·delphi 在WORD文档里添加页签
·delphi Asta多层应用实现
·delphi Datamodule的应用方式
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932