在Delphi中使用Queued 元件 (轉)
在中使用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/10752043/viewspace-993825/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在Delphi中使用IP控制元件 (轉)控制元件
- 在delphi中使用flash控制元件 (轉)控制元件
- 在Delphi中編寫控制元件的基本方法 (轉)控制元件
- 在Delphi中編寫控制元件的基本方法(1) (轉)控制元件
- 在DELPHI中圖片轉換
- 在Delphi中操作快捷方式 (轉)
- 在DELPHI程式中撥號上網 (轉)
- 在Delphi中巧用WINDOWS 的API函式 (轉)WindowsAPI函式
- 在Delphi中實現圖片的旋轉、縮放 (轉)
- 在DELPHI2.0/3.0中直接操作埠 (轉)
- Delphi編碼標準——元件命名 (轉)元件
- 在BCB中輕鬆使用ActiveX控制元件 (轉)控制元件
- 在Delphi中實現任意形狀的窗體 (轉)
- 在Delphi中捕獲控制檯程式的輸出 (轉)
- Delphi的元件讀寫機制(一) (轉)元件
- Delphi的元件讀寫機制(二) (轉)元件
- Delphi的元件讀寫機制(三) (轉)元件
- Delphi元件與屬性編輯器 (轉)元件
- 在VB.Net中建立使用控制元件陣列 (轉)控制元件陣列
- 用Delphi在區域網中實現網上影院 (轉)
- Delphi使用VB編寫的ActiveX控制元件全攻略 (轉)控制元件
- 對Delphi控制元件的一點改良 (轉)控制元件
- Delphi中儲存影像列表 (轉)
- Delphi中的類和物件 (轉)物件
- 在Delphi程式設計中獲取作業系統資訊 (轉)程式設計作業系統
- 改良控制元件-Delphi自帶控制元件Bug的消除 (轉)控制元件
- 在DELPHI程式中使用ADO物件存取ODBC資料庫 (轉)物件資料庫
- 對Delphi控制元件的一點改良(二) (轉)控制元件
- delphi 控制元件的拿來主義(一) (轉)控制元件
- 相當於delphi的日曆控制元件 (轉)控制元件
- Delphi控制元件的拿來主義(二) (轉)控制元件
- 對Delphi控制元件的一點改良(三) (轉)控制元件
- Delphi控制元件的拿來主義(三) (轉)控制元件
- 關於Delphi中預編譯指令的使用方法 (轉)編譯
- 在ASP.NET中使用.NET元件 (轉)ASP.NET元件
- 在Delphi中開發使用多顯示器的應用程式
- delphi中Treeview的使用介紹View
- 利用Delphi 5中呼叫Excel 97 (轉)Excel