Rejestrowanie wywołania zwrotnego w Visual Basic

Dodawanie wywołania zwrotnego w języku Visual Basic różni się od metody używanej w języku VBScript. Funkcja GetRef używana w języku VBScript różni się od tej używanej w języku Visual Basic. W związku z tym deweloper musi utworzyć obiekt IDispatch, który ma funkcję wywołania zwrotnego jako domyślną metodę. Ten temat zawiera niezbędne informacje dotyczące tworzenia aplikacji języka Visual Basic.

Aby zaimplementować to wywołanie zwrotne w aplikacji

  1. Dodaj odwołania do dwóch bibliotek obiektów: TLBTypes.olb i VboostTypes6.olb. Te biblioteki obiektów są dostarczane z przykładowym kodem punktu sterowania.

  2. Dodaj odwołanie do pliku Cbklib.tlb. Ten plik definiuje strukturę funkcji wywołania zwrotnego.

    Plik cbklib.tlb jest tworzony przy użyciu pliku cbklib.idl dołączonego do przykładowego kodu punktu sterowania. Zaleca się zmianę nazwy tego pliku dla funkcji wywołania zwrotnego, które różnią się strukturą ich parametrów. W tym przykładzie użyto języka MIDL do utworzenia pliku biblioteki typów.

  3. Napisz funkcję wywołania zwrotnego. Parametry są takie same jak w przykładzie VBScript w Rejestrowanie wywołania zwrotnego. Ten przykład drukuje ciąg za każdym razem, gdy nadejdzie zdarzenie.

    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. Dodaj funkcję wywołania zwrotnego do obiektuIUPnPService, jak pokazano w poniższym przykładzie, lub w innym obiekcie, takim jak IUPnPDeviceFinder, przy użyciu odpowiedniej biblioteki typów wywołania zwrotnego (cbklib.tbl).

    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
    

W poniższym przykładzie obiekt IUPnPService jest przekazywany do funkcji. Funkcja wywołania zwrotnego jest następnie dodawana jako parametr.

    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)

Biblioteki obiektów używane w przykładowym kodzie

W poprzednich przykładach i przykładowym kodzie punktu sterowania użyto niektórych z następujących bibliotek obiektów:

  1. TLBTypes.olb — ta biblioteka definiuje niektóre typy i interfejsy typów używane w przykładowym kodzie. Definiuje niektóre funkcje używane w języku Visual Basic, takie jak LoadTypeLibEx, które są już dostępne w języku C lub C++.
  2. VboostTypes6.olb — ta biblioteka definiuje niektóre typy podstawowe, które są używane w TLBTypes.olb i FunctionDelegator.bas. Więcej informacji na temat TLBTypes można znaleźć w książce Advanced Visual Basic 6: Power Techniques for Everyday Programs, autorstwa Matthew Curlanda (Addison-Wesley, lipiec 2000, ISBN: 0-201-70712-8). (Ta książka może nie być dostępna w niektórych językach i krajach).

Przykładowy kod punktu sterowania i poniższe biblioteki są powiązane z tą sekcją i są potrzebne do zaimplementowania tego wywołania zwrotnego. Można je znaleźć za pomocą przykładowego kodu punktu sterowania:

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