Registering a Callback in Visual Basic
Adding a callback in Visual Basic is different from the method used in VBScript. The GetRef function used in VBScript is different than the one used in Visual Basic. Therefore, a developer must create an IDispatch object that has the callback function as the default method. This topic provides the necessary information to develop Visual Basic applications.
To implement this callback in an application
Add references to two object libraries: TLBTypes.olb and VboostTypes6.olb. These object libraries are provided with the Control Point sample code.
Add a reference to Cbklib.tlb. This file defines the structure of the callback function.
The cbklib.tlb is created using the cbklib.idl file that is included as part of the Control Point sample code. It is recommended that the name of this file change for callback functions that differ in the structure of their parameters. This example uses MIDL to create the type library file.
Write the callback function. The parameters are the same as in the VBScript example in Registering a Callback. This example prints a string whenever an event arrives.
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
Add the callback function to the IUPnPService object, as shown in the following example, or in another object such as IUPnPDeviceFinder, using the appropriate callback type library (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
In the following example, the IUPnPService object is passed to the function. The callback function is then added as the parameter.
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)
Object Libraries Used in the Sample Code
The previous examples and the Control Point sample code use some of the following object libraries:
- TLBTypes.olb — This library defines some of the type library types and interfaces that are used in the sample code. It defines some of the functions to be used in Visual Basic, such as LoadTypeLibEx, that are already available in C or C++.
- VboostTypes6.olb — This library defines some base types which are used in TLBTypes.olb and FunctionDelegator.bas. Further information regarding TLBTypes can be found in the book Advanced Visual Basic 6: Power Techniques for Everyday Programs, by Matthew Curland (Addison-Wesley, July 2000, ISBN: 0-201-70712-8). (This book may not be available in some languages and countries.)
The Control Point sample code and the following libraries are related to this section and are needed to implement this callback. They can be found with the Control Point sample code:
- Cbklib.idl
- Cbklib.tlb
- VboostTypes6.olb
- TLBTypes.olb
- FunctionDelegator.bas