在Delphi中使用Queued Components
發(fā)表時(shí)間:2023-08-01 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]隊(duì)列組件(Queued Components)是一項(xiàng)基于微軟消息隊(duì)列服務(wù)(Microsoft Message Queuing Services)的COM+技術(shù)。它提供了一種簡(jiǎn)易的異步引用和執(zhí)行組件的...
隊(duì)列組件(Queued Components)是一項(xiàng)基于微軟消息隊(duì)列服務(wù)(Microsoft Message Queuing Services)的COM+技術(shù)。它提供了一種簡(jiǎn)易的異步引用和執(zhí)行組件的方法。發(fā)送方和接收方都不心考慮對(duì)方現(xiàn)在是否可用和能否獲得而獨(dú)立運(yùn)行。
作為一項(xiàng)COM技術(shù)。隊(duì)列指的是用于存儲(chǔ)消息以便將來檢索的空間。隊(duì)列提供了一種非連接性的通訊機(jī)制(即發(fā)送方和接怍方之間并不是直接相連結(jié),而是通過隊(duì)列進(jìn)行相互通訊)。隊(duì)列負(fù)責(zé)存儲(chǔ)信息直到接收方準(zhǔn)備好為止。由于發(fā)送方和接收方之間不是直接通訊的,所以可以相互之間獨(dú)立地運(yùn)行,而不會(huì)影響到雙方。
下面舉例說明如何使用Delphi創(chuàng)建和使用隊(duì)列組件。
首先,我們將創(chuàng)建一個(gè)服務(wù)器。接口中的所有方法必須僅使用IN參數(shù),不能有返回值。這是由于客戶端和服務(wù)器之間并沒有直接的連結(jié)。因?yàn)椴荒艽_切地知道請(qǐng)求什么時(shí)候會(huì)被執(zhí)行,所以客戶端不能一直等待從服務(wù)器獲得應(yīng)答。
在Delphi中,首先打開file/new/other/activeX,創(chuàng)建一個(gè)ActiveX Library,然后,加入一個(gè)automation對(duì)象。為你的服務(wù)器對(duì)象取一個(gè)名稱,比如QdComponent,其他的選項(xiàng)都使用默認(rèn)值,單擊OK.這時(shí)你將會(huì)看到Type Library Editor,添加一個(gè)方法,命名為Task1,為這個(gè)方法添加一個(gè)參數(shù),命名為TaskMessage,設(shè)定其類型為BSTR(即Delphi中的WideString類型)。如果Type Library Options設(shè)置為show Pascal code,那么你的方法聲明代碼應(yīng)與以下代碼類似:
procedure task1(TaskMessage:widestring) [dispid $00000001];safecall;
保存項(xiàng)目文件為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.
安裝服務(wù)器
在控制面板中打開組件服務(wù)工具(Component Services Tool),在文件樹中找到”COM+ Application”,然后右擊,選擇New/Application接著選擇“Create an empty applcation”根據(jù)提示找到你的新程序,右擊它,轉(zhuǎn)到屬性頁(yè),找到Queuing欄,選擇復(fù)選框中的兩項(xiàng)1.Queued 2.Listen.Listen表示任何被壓入隊(duì)列的消息,當(dāng)它被擊活時(shí),將馬上被處理。在你的新程序下右擊“components”選擇New/Component,選擇“install new component(s)”,根據(jù)提示,找到并安裝你的DLL文件,然后展開文件樹找到“interface”,右擊IqdComponent,打開屬性頁(yè),在Queuing欄中選上”Queued”(如果看到出錯(cuò)提示信息“MSMQ IS NOT RUNNING”)那么很可能你沒有安裝MSMQ,因?yàn)镸SMQ不是默認(rèn)的WINDOWS 2000的安裝選項(xiàng)。
創(chuàng)建客戶端
創(chuàng)建一個(gè)新的Delphi應(yīng)用程序,在uses子句中加入MyQdServer_tlb.pas單元文件,添加一個(gè)按鈕和一個(gè)文本框。
你需要在程序運(yùn)行時(shí)創(chuàng)建你的對(duì)象,所以使用一個(gè)符號(hào)變量來標(biāo)記組件的信息,這個(gè)參數(shù)在FormShow事件處理函數(shù)中聲明和使用。
具體代碼如下:
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{服務(wù)器的GUID或Server.interfaceName}’;
Olecheck(NewCoGetObject(Qmoniker,nil,IqdComponent,Qinterface));
End;
End.
運(yùn)行客戶端程序,然后傳送一條消息,由于此時(shí)你并沒有啟動(dòng)服務(wù)器,所以這時(shí)并不能顯示出來這條消息,需要啟動(dòng)服務(wù)器,而最簡(jiǎn)單的方法就是打開控制面板中的組件服務(wù)(Component Services),找到你的服務(wù)器,右擊選擇啟動(dòng)。