Поделиться через


Регистрация обратного вызова в Visual Basic

Добавление обратного вызова в Visual Basic отличается от метода, используемого в VBScript. Функция GetRef , используемая в VBScript, отличается от функции, используемой в 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. Добавьте функцию обратного вызова в объект IUPnPService , как показано в следующем примере, или в другой объект, например IUPnPDeviceFinder, используя соответствующую библиотеку типов обратного вызова (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
    

В следующем примере объект 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)

Библиотеки объектов, используемые в образце кода

В предыдущих примерах и примере кода контрольной точки используются некоторые из следующих библиотек объектов:

  1. TLBTypes.olb — эта библиотека определяет некоторые типы библиотек типов и интерфейсы, используемые в примере кода. Он определяет некоторые функции, которые будут использоваться в Visual Basic, например LoadTypeLibEx, которые уже доступны в C или C++.
  2. VboostTypes6.olb — эта библиотека определяет некоторые базовые типы, используемые в TLBTypes.olb и FunctionDelegator.bas. Дополнительные сведения о TLBTypes можно найти в книге Advanced Visual Basic 6: Power Techniques for Everyday Programs (Advanced Visual Basic 6: Power Techniques for Everyday Programs) (Мэтью Керленду(Мэтью Керленду) (Addison-Wesley, July 2000, ISBN: 0-201-70712-8). (Эта книга может быть недоступна на некоторых языках и в некоторых странах.)

Пример кода контрольной точки и следующие библиотеки относятся к этому разделу и необходимы для реализации этого обратного вызова. Их можно найти с помощью примера кода контрольной точки:

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