Visual Basic でのコールバックの登録

Visual Basic でのコールバックの追加は、VBScript で使用されるメソッドとは異なります。 VBScript で使用される GetRef 関数は、Visual Basic で使用される関数とは異なります。 したがって、開発者は、既定のメソッドとしてコールバック関数を持つ IDispatch オブジェクトを作成する必要があります。 このトピックでは、Visual Basic アプリケーションを開発するために必要な情報を提供します。

アプリケーションでこのコールバックを実装するには

  1. TLBTypes.olb と VboostTypes6.olb の 2 つのオブジェクト ライブラリへの参照を追加します。 これらのオブジェクト ライブラリには、コントロール ポイントのサンプル コードが用意されています。

  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 オブジェクトに追加するか、適切なコールバック タイプ ライブラリ (cbklib.tbl) を使用して 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)

サンプル コードで使用されるオブジェクト ライブラリ

前の例とコントロール ポイントのサンプル コードでは、次のオブジェクト ライブラリの一部を使用しています。

  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」(マシュー・カーランド、Addison-Wesley、2000 年 7 月、ISBN: 0-201-70712-8) を参照してください。 (この本は一部の言語や国では利用できない場合があります。

コントロール ポイントのサンプル コードと次のライブラリは、このセクションに関連しており、このコールバックを実装するために必要です。 これらは、コントロール ポイントのサンプル コードを使用して確認できます。

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