在 Visual Basic 中新增回呼與 VBScript 中使用的方法不同。 VBScript 中使用的 GetRef 函式與 Visual Basic 中使用的函式不同。 因此,開發人員必須建立具有回呼函式做為預設方法 IDispatch 物件。 本主題提供開發Visual Basic應用程式的必要資訊。
在應用程式中實作此回呼
新增對兩個物件庫的參考:TLBTypes.olb 和 VboostTypes6.olb。 這些物件連結庫隨附控制點範例程序代碼。
新增 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使用適當的回呼類型函式庫(cbklib.tbl),將回呼函式新增至 IUPnPService 物件,如下例所示,或新增至另一個物件,例如 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)
範例程式代碼中使用的對象連結庫
上述範例和 Control Point 範例程式代碼會使用下列一些物件庫:
- TLBTypes.olb - 此程式庫定義範例代碼中使用的一些型別程式庫類型和介面。 它會定義一些要用於 Visual Basic 的函式,例如 LoadTypeLibEx,這些函式已在 C 或 C++ 中使用。
- VboostTypes6.olb - 此函式庫定義了一些在 TLBTypes.olb 和 FunctionDelegator.bas 中使用的基礎類型。如需 TLBTypes 的進一步資訊,請參閱 進階 Visual Basic 6:每天程式的強大技術,由 Matthew Curland(Addison-Wesley,2000 年 7 月,ISBN: 0-201-70712-8)。 (這本書可能無法在某些語言和國家/地區使用。
控制點範例程式代碼和下列連結庫與本節相關,而且需要實作此回呼。 您可以使用控制點範例程式代碼來找到它們:
- Cbklib.idl
- Cbklib.tlb
- VboostTypes6.olb
- TLBTypes.olb
- FunctionDelegator.bas