注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

鑫淼梦园的博客

圆你的梦想 从这里开始

 
 
 

日志

 
 

Delphi下MSMQ(Mircosoft Message Queue)实例  

2013-10-20 18:34:22|  分类: delphi xe5 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Delphi下MSMQ(Mircosoft Message Queue)实例(私有队列)  

网上关于消息队列技术原理说明的详细文档很多,但涉及到Delphi的具体实现很少,这是我从网上找了一上午的资料,自己整合和尝试的能运行的程序。

打开控制面板->程序->添加组件,添加消息队列

打开控制面板->计算机管理->服务与应用程序->消息队列,添加私有有消息Test.

在Delphi中添加MSMQ控件, TMSMQMessage; TMSMQQueueInfo; TMSMQQueue; TMSMQEvent; 这些控件在Project->Import type Library里存在。

源代码如下:

 

  1. unit Unit1;  
  2. interface  
  3. uses  
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  5.   Dialogs,MSMQ_TLB,ComObj, StdCtrls, OleServer;  
  6. type  
  7.   TForm1 = class(TForm)  
  8.     MSMQMessage1: TMSMQMessage;  
  9.     MSMQQueueInfo1: TMSMQQueueInfo;  
  10.     MSMQQueue1: TMSMQQueue;  
  11.     MSMQEvent1: TMSMQEvent;  
  12.     Button1: TButton;  
  13.     edit1: TEdit;  
  14.     edit2: TEdit;  
  15.     Button2: TButton;  
  16.     lbl1: TLabel;  
  17.     lbl2: TLabel;  
  18.     procedure Button1Click(Sender: TObject);  
  19.     procedure Button2Click(Sender: TObject);  
  20.     procedure MSMQEvent1Arrived(Sender: TObject; var Queue: OleVariant;  
  21.       Cursor: Integer);  
  22.   private  
  23.     { Private declarations }  
  24.   public  
  25.     { Public declarations }  
  26.   end;  
  27. var  
  28.   Form1: TForm1;  
  29. implementation  
  30. {$R *.dfm}  
  31. //发送消息   
  32. procedure TForm1.Button1Click(Sender: TObject);  
  33. begin  
  34.     //确定消息队列路径   
  35.     MSMQQueueInfo1.PathName       :='.\private$/Test';  
  36.     //远程机器名   
  37.     MSMQQueueInfo1.RemoteMachineName   :=   '127.0.0.1'   ;  
  38.     //消息内容   
  39.     (MSMQMessage1.DefaultInterface   as   IMSMQMessage).body   :=edit1.Text;  
  40.     //连接到消息队列   
  41.     MSMQQueue1.ConnectTo(MSMQQueueInfo1.Open(MQ_SEND_ACCESS,       0));  
  42.     //发送消息   
  43.     MSMQMessage1.Send(MSMQQueueInfo1.Open(MQ_SEND_ACCESS,       MQ_DENY_NONE));  
  44.     showmessage( '已经把信息入写入消息队列中 ');  
  45. end;  
  46. //接收消息   
  47. procedure TForm1.Button2Click(Sender: TObject);  
  48. begin  
  49.   msmqqueueinfo1.PathName   :='.\private$/Test';  
  50.   msmqqueue1.Disconnect;  
  51.   msmqqueue1.ConnectTo(msmqqueueinfo1.Open(1,   0));  
  52.   //   
  53.   msmqqueue1.EnableNotification(MSMQEvent1.DefaultInterface);  
  54. end;  
  55. //MSMQEvent事件   
  56. procedure TForm1.MSMQEvent1Arrived(Sender: TObject; var Queue: OleVariant;  
  57.   Cursor: Integer);  
  58.       var  
  59.   Msg:   Variant;  
  60.   begin  
  61.   //从队列中读取消息   
  62.   Msg   :=   msmqqueue1.Receive;  
  63.   edit2.Text :=   Msg.body;  
  64. end;  
  65. end.  
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,MSMQ_TLB,ComObj, StdCtrls, OleServer;
type
  TForm1 = class(TForm)
    MSMQMessage1: TMSMQMessage;
    MSMQQueueInfo1: TMSMQQueueInfo;
    MSMQQueue1: TMSMQQueue;
    MSMQEvent1: TMSMQEvent;
    Button1: TButton;
    edit1: TEdit;
    edit2: TEdit;
    Button2: TButton;
    lbl1: TLabel;
    lbl2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure MSMQEvent1Arrived(Sender: TObject; var Queue: OleVariant;
      Cursor: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
//发送消息
procedure TForm1.Button1Click(Sender: TObject);
begin
    //确定消息队列路径
    MSMQQueueInfo1.PathName       :='./Private$/Test';
    //远程机器名
    MSMQQueueInfo1.RemoteMachineName   :=   '127.0.0.1'   ;
    //消息内容
    (MSMQMessage1.DefaultInterface   as   IMSMQMessage).body   :=edit1.Text;
    //连接到消息队列
    MSMQQueue1.ConnectTo(MSMQQueueInfo1.Open(MQ_SEND_ACCESS,       0));
    //发送消息
    MSMQMessage1.Send(MSMQQueueInfo1.Open(MQ_SEND_ACCESS,       MQ_DENY_NONE));
    showmessage( '已经把信息入写入消息队列中 ');
end;
//接收消息
procedure TForm1.Button2Click(Sender: TObject);
begin
  msmqqueueinfo1.PathName   :='./Private$/Test';
  msmqqueue1.Disconnect;
  msmqqueue1.ConnectTo(msmqqueueinfo1.Open(1,   0));
  //
  msmqqueue1.EnableNotification(MSMQEvent1.DefaultInterface);
end;
//MSMQEvent事件
procedure TForm1.MSMQEvent1Arrived(Sender: TObject; var Queue: OleVariant;
  Cursor: Integer);
      var
  Msg:   Variant;
  begin
  //从队列中读取消息
  Msg   :=   msmqqueue1.Receive;
  edit2.Text :=   Msg.body;
end;
end. 

 

可以连续发送多条不同的消息。消息会添加到消息队列。每“接收”一次会从消息队列中获取一条消息并显示在接受消息框中。

  评论这张
 
阅读(587)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017