在 Visual Basic 中註冊回呼
在 Visual Basic 中新增回呼與 VBScript 中使用的方法不同。 VBScript 中使用的 GetRef 函式與 Visual Basic 中使用的函式不同。 因此,開發人員必須建立 IDispatch 物件,該物件具有回呼函式作為預設方法。 本主題提供開發 Visual Basic 應用程式的必要資訊。
在應用程式中實作此回呼
將參考新增至兩個物件程式庫:TLBTypes.olb 和 VboostTypes6.olb。 這些物件程式庫會隨附 Control Point 範例程式碼。
新增 Cbklib.tlb 的參考。 此檔案會定義回呼函式的結構。
cbklib.tlb 是使用包含在控制點範例程式碼中的 cbklib.idl 檔案來建立。 建議針對其參數結構不同之回呼函式變更此檔案的名稱。 此範例會使用 MIDL 來建立類型程式庫檔案。
撰寫回呼函式。 參數與 註冊回呼中的 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
使用適當的回呼類型程式庫,將回呼函式新增至 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)
範例程式碼中使用的物件程式庫
上述範例和 Control Point 範例程式碼會使用下列一些物件程式庫:
- TLBTypes.olb — 此程式庫會定義範例程式碼中使用的一些類型程式庫類型和介面。 它會定義 Visual Basic 中使用的一些函式,例如 LoadTypeLibEx,這些函式已在 C 或 C++ 中使用。
- VboostTypes6.olb — 此程式庫會定義 TLBTypes.olb 和 FunctionDelegator.bas 中使用的一些基底類型。如需 TLBTypes 的進一步資訊,請參閱 進階 Visual Basic 6:每日程式的 Power 技術,作者:Foundation Curland (Addison-Wesley,2000 年 7 月,ISBN:0-201-70712-8) 。 (本書籍可能無法在某些語言和國家/地區中使用。)
控制點範例程式碼和下列程式庫與本節相關,而且需要實作此回呼。 您可以使用控制點範例程式碼找到:
- Cbklib.idl
- Cbklib.tlb
- VboostTypes6.olb
- TLBTypes.olb
- FunctionDelegator.bas