如何將物件當做參數傳遞至 COM + 佇列元件

文章翻譯 文章翻譯
文章編號: 246627 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

結論

佇列元件允許您呼叫物件的函式會錄製轉寄透過 「 Microsoft 訊息佇列伺服器 」 (MSMQ),然後重新顯示在伺服器設定佇列的元件。在某些情況下所記錄之函式的參數可能會包含物件。您可以利用來達成此目的佇列的元件,但您必須遵循特定規則才能重新建立方法呼叫播放時在伺服器的引數物件:
  • 做為引數傳遞的物件必須支援 IPersistStream。在 Visual Basic 中它必須被標示為永久性"],必須正確地實作 Class_ReadProperties 和 Class_WriteProperties 的函式。
  • 做為引數傳遞的物件類別必須正確地登錄在用戶端電腦和伺服器電腦。
  • 獨立的在上面建立為已排入佇列的元件執行個體可能會被當做參數傳遞至第二個佇列元件。

其他相關資訊

它的運作方式

什麼跳呼叫是對佇列元件和物件做為引數傳遞時?

以下是一項範例: 假設您有使用來管理客戶資訊稱為 Customer.CCustomer 物件。 此物件 Customer.dll 檔案中實作,下列程式碼。 請注意它會標記為永久性並注意其適當的方法實作:
'CCustomer Class. Marked as 'Persistable'
Option Explicit

Public Name As String
Public Age As Integer
Public Address As String

Private Sub Class_ReadProperties(PropBag As PropertyBag)
    Name = PropBag.ReadProperty("Name")
    Age = PropBag.ReadProperty("Age")
    Address = PropBag.ReadProperty("Address")
    MsgBox "Person read!!"
End Sub

Private Sub Class_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "Name", Name
    PropBag.WriteProperty "Age", Age
    PropBag.WriteProperty "Address", Address
    MsgBox "Person Written!!"
End Sub

Private Sub Class_Initialize()
    MsgBox "CCustomer Class_Initialize"
End Sub

Private Sub Class_Terminate()
    MsgBox "CCustomer Class_Terminate"
End Sub
				
這個範例類別不會執行任何動作除了快取資訊。在真實世界的案例但是,您就可能有其他方法 (和沒有訊息] 方塊中 Class_Initialize!)。

現在想像一下就專為伺服器的使用所設計的物件。這個物件稱為 Orders.COrder、 在不同的檔案稱為 Orders.dll,下列程式碼的函式:
Public Sub AddOrder(ByVal ItemID As Long, ByVal Amount As Double, ByVal Customer As Customer.CCustomer)
    
    MsgBox "Customer order for item '" & ItemID & "' for " & Customer.Name
    
End Sub
				
注意訂單的客戶資訊直接指定為 Customer.CCustomer 之型別的物件。真實世界中您可能會攻打在這個方法的一些資料庫活動。不過,在這個範例中您做的就是引發訊息方塊。

而且最後一個,不過不至少沒有用戶端執行檔的應用程式。這就是表單] 和 [指令按鈕,在其中鍵入下列程式碼:
    Dim oOrder As COrder
    
    Dim oCust As CCustomer
    Set oCust = New CCustomer
    oCust.Name = "Eduardo A. Jezierski"
    oCust.Age = 23
    oCust.Address = "One Microsoft Way, Redmond, WA"
    
    Set oOrder = New COrder    
    oOrder.AddOrder 123, 100, oCust
    Set oOrder = Nothing
    
    Set oCust = Nothing
				
說您已設定您的訂單的元件內的 COM +,將它加入至 COM + 應用程式。當使用者按一下按鈕在用戶端會發生下列情況:
  1. CCustomer 物件是建立 (引發 CCustomer Class_Initialize 訊息方塊),而且用戶端所填入。
  2. 會建立 COrder 物件。
  3. AddOrder 方法執行在 COM + 應用程式。
  4. 說出 「 客戶序位 Eduardo A.Jezierski 的項目 '123' 」 的訊息方塊隨即出現。
  5. 終結 COrder 執行個體。
  6. 會終結在向上 CCustomer Class_Terminate 訊息方塊將帶 CCustomer 執行個體。

將佇列中

所以如果會發生什麼事現在你帶上佇列元件?

若要測試這,先設定您的 COrder 元件如已排入佇列。請參閱下列微軟知識庫文件,指示:
246825如何設定 COM + 應用程式的進入佇列元件
接下來,修改用戶端應用程式,讓在佇列中建立的元件。如果要執行這項操作,變更的行,如下所示是建立 [COrder 的位置:
Set o = GetObject("queue:/new:Orders.COrder")
				
這會有效地提供您所錄製方法呼叫,並分派他們到 COrder 物件坐在 COM + 應用程式的替代"COrder 物件。

其餘的應用程式仍保持不變。 當測試,不過,會發生一組非常不同的事件:
  1. 第一次,客戶物件建立並填入由用戶端。
  2. 使用指定的 Moniker GetObject 函數建立 COrder 佇列錄製器執行個體。
  3. 叫用 AddOrder 方法。[客戶] 物件取得其 Class_WriteProperties 中採用的行為是否為一個 COrder [QC 錄製函式呼叫,以便保存其狀態,搭配所有其他參數 (ItemID 和數量)。
  4. COrder 錄製器執行個體設定為執行任何動作。在此點所有封裝一起用戶端安全性語彙基元和其他資訊的上它 (只在這個案例 AddOrder) 叫用呼叫包裝在 Microsoft 訊息佇列伺服器 (MSMQ) 訊息,並傳送目的地。
  5. 具有完成其工作,用戶端會終結客戶執行個體,並完成其工作。

    另一方面...

  6. 一旦郵件傳送您假設它最後會到達預定的應用程式佇列。
  7. 因為應用程式已設定為接聽的訊息,會偵測 MSMQ 訊息抵達,並找出它屬於一個 COrder 由使用者 X 的類別。之後執行存取檢查它的伺服器上建立一個 COrder 執行個體。
  8. 現在會開始在本文中播放 」 的一部分。QC 玩家開始叫用方法儲存在郵件中燒錄機。
  9. 在這種情況下,是只要 AddOrder 方法。不過,因為參數包含 Customer 物件,一個 CCustomer 執行個體的建立第一次,而它導向至 「 載入 」 本身透過 [Class_ReadProperties 函式。
  10. 一旦載入該執行個體播放程式實際叫用真實的 COrder 物件上 AddOrder 方法以便其工作。將新的客戶執行個體傳遞做為呼叫] 引數,一旦完成呼叫它會終結這個暫存的執行個體。然後叫用類似的方式任何其他錄製的呼叫,並釋放 COrder 物件和暫存 CCustomer 執行個體。
執行未察覺了客戶執行個體它已使用的情況下您 COrder 碼真的是一個本機和不同的執行個體儲存本身在用戶端、 或許分鐘或小時前客戶物件。在這種方式被維持整個非同步模型。

屬性

文章編號: 246627 - 上次校閱: 2014年2月24日 - 版次: 2.7
這篇文章中的資訊適用於:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
關鍵字:?
kbnosurvey kbarchive kbmt kbcomplusqc kbhowto KB246627 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:246627
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com