注册暂时性订阅

暂时性订阅为已经存在的特定订户对象请求事件。 暂时性订阅存储在 COM+ 目录中,但如果事件系统或操作系统停止,则会删除订阅。 与永久性订阅不同,暂时性订阅绑定到特定对象,并且仅存储在事件系统中。 如果事件系统或操作系统出现问题,则订阅将消失。 暂时性订阅比永久性订阅更高效,但必须管理其对象生命周期。

无法使用组件服务管理工具设置暂时性订阅。 必须使用 COM+ 管理接口来创建或更新暂时性订阅。

Visual Basic

以下过程介绍如何使用 Microsoft Visual Basic 创建暂时性订阅:

  1. 通过向 TransientSubscriptions 集合添加一个新条目,并将 SubscriberInterface 属性设置为订阅对象的 IUnknown 接口,将订阅指定为暂时性订阅。 COM+ 事件在触发事件时不会创建订户对象的新实例,而是使用指定的实例。 COM+ 事件保存订户对象的引用计数,直到从系统中删除订阅。

  2. 使用实现要订阅的接口或方法的对象创建 COM+ 服务器应用程序(.exe、.dll 或 .ocx 文件)。

  3. 通过传入事件类对象的 CLSID 和订户对象的实例,使用以下代码创建暂时性订阅。 使用组件服务管理工具,可以右键单击 COM+ 组件,选择属性,然后选择常规选项卡,获取 EventCLSID 属性。

    Public Function CreateTransientSubscription( _
      ByVal clsid As String, ByVal objref As Object) As String 
        Dim oCOMAdminCatalog As COMAdmin.COMAdminCatalog
        Dim oTSCol As COMAdminCatalogCollection
        Dim oSubscription As ICatalogObject
        Dim objvar As Variant
        On Error GoTo CreateTransientSubscriptionError
        Set oCOMAdminCatalog = CreateObject("COMAdmin.COMAdminCatalog")
        'Gets the TransientSubscriptions collection
        Set oTSCol = oCOMAdminCatalog.GetCollection( _
          "TransientSubscriptions")
        Set oSubscription = oTSCol.Add
        Set objvar = objref
        oSubscription.Value("SubscriberInterface") = objref
        oSubscription.Value("EventCLSID") = clsid
        oSubscription.Value("Name") = "TransientSubscription"
        oTSCol.SaveChanges
        CreateTransientSubscription = oSubscription.Value("ID")
        Set oSubscription = Nothing
        Set oTSCol = Nothing
        Set oCOMAdminCatalog = Nothing
        Set objvar = Nothing
        Exit Function
    CreateTransientSubscriptionError:
        CreateTransientSubscription = ""
        Err.Raise Err.Number, "[CreateTransientSubscription]" & _
          Err.Source, Err.Description
    End Function
    

以下示例说明如何调用 CreateTransientSubscription 函数来订阅名为 IStockTicker 的接口,该接口具有一个名为 UpdateStock 的方法。

  1. 创建一个支持接口 IStockTicker 的事件类,该接口具有一个方法 UpdateStock。

  2. 在订户项目中,添加实现 IStockTicker 接口的类。

  3. 如果要订阅,请执行以下代码:

    Dim oMyTicker As Object
    Dim sSubscriptionID As String
    Set oMyTicker = CreateObject("TheProject.CMyTicker")
    sSubscriptionID = CreateTransientSubscription( _
      "{..CLSID for the Event Class..}", oMyTicker)
    

CreateTransientSubscription 函数返回一个字符串,该字符串是一个 GUID,可用作句柄或 Cookie 以稍后撤消订阅。 若要删除订阅,请对 TransientSubscriptions 集合调用 COMAdminCatalogCollectionRemove 方法,并传入与之前收到的 GUID 对应的订阅的索引。

注册订阅