在 Visual Basic 中註冊回呼函式

在 Visual Basic 中新增回呼與 VBScript 中使用的方法不同。 VBScript 中使用的 GetRef 函式與 Visual Basic 中使用的函式不同。 因此,開發人員必須建立具有回呼函式做為預設方法 IDispatch 物件。 本主題提供開發Visual Basic應用程式的必要資訊。

在應用程式中實作此回呼

  1. 新增對兩個物件庫的參考:TLBTypes.olb 和 VboostTypes6.olb。 這些物件連結庫隨附控制點範例程序代碼。

  2. 新增 Cbklib.tlb 的參考。 此檔案會定義回呼函式的結構。

    cbklib.tlb 是使用包含在控制點範例程序代碼一部分的 cbklib.idl 檔案來建立。 建議針對參數結構不同的回呼函式,變更此檔案的名稱。 此範例使用 MIDL 來建立類型函式庫檔案。

  3. 撰寫回呼函式。 參數與 註冊回呼中的 VBScript 範例相同。 本範例會在事件到達時列印字串。

    Function eventHandler(ByVal callbackType As Variant, _
    ByVal svcObj As Variant, ByVal varName As Variant, _
    ByVal value As Variant) As Long
    
        On Error GoTo Error
        'Write some interesting code to do actual work here
    
        MsgBox "Event Handler Called"
        Exit Function
    
    Error:
        With Err
            If .Number > 0 Then
                eventHandler = .Number Or &H800A0000
            Else
                eventHandler = .Number
            End If
        End With
    End Function
    
  4. 使用適當的回呼類型函式庫(cbklib.tbl),將回呼函式新增至 IUPnPService 物件,如下例所示,或新增至另一個物件,例如 IUPnPDeviceFinder

    Public Sub AddCbFunction(upnpSvc As UPnPService)
    
        Dim X As CallbackIUnknownLib.CallBackInterface
        Dim obj As Object
        Dim ptinfo As ITypeInfo
        Dim ptcomp As ITypeComp
    
        With LoadTypeLibEx(App.Path & "\cbklib.tlb", _
          REGKIND_NONE).GetTypeComp
            .BindType "CallBackInterface", 0, ptinfo, ptcomp
        End With
    
        'NewDelegator is defined in FunctionDelegator.bas
        Set X = NewDelegator(AddressOf eventHandler) 
        Set obj = CreateStdDispatch(Nothing, ObjPtr(X), ptinfo)
        upnpSvc.AddCallback obj
    End Sub
    

在下列範例中,IUPnPService 物件會傳遞至 函式。 回呼函式接著會新增為 參數。

    Dim device as UPnPDevice
    Dim svcObj as UpnPService

    ' Initialize the device using the FindByType or using other methods of finding the devices
    Set svcObj = device.Services("appropriateService")
    Call AddCbFunction(svcObj)

範例程式代碼中使用的對象連結庫

上述範例和 Control Point 範例程式代碼會使用下列一些物件庫:

  1. TLBTypes.olb - 此程式庫定義範例代碼中使用的一些型別程式庫類型和介面。 它會定義一些要用於 Visual Basic 的函式,例如 LoadTypeLibEx,這些函式已在 C 或 C++ 中使用。
  2. VboostTypes6.olb - 此函式庫定義了一些在 TLBTypes.olb 和 FunctionDelegator.bas 中使用的基礎類型。如需 TLBTypes 的進一步資訊,請參閱 進階 Visual Basic 6:每天程式的強大技術,由 Matthew Curland(Addison-Wesley,2000 年 7 月,ISBN: 0-201-70712-8)。 (這本書可能無法在某些語言和國家/地區使用。

控制點範例程式代碼和下列連結庫與本節相關,而且需要實作此回呼。 您可以使用控制點範例程式代碼來找到它們:

  • Cbklib.idl
  • Cbklib.tlb
  • VboostTypes6.olb
  • TLBTypes.olb
  • FunctionDelegator.bas