github.com/gofiber/fiber/v2@v2.47.0/internal/go-ole/oleutil/connection_windows.go (about) 1 //go:build windows 2 // +build windows 3 4 package oleutil 5 6 import ( 7 "reflect" 8 "syscall" 9 "unsafe" 10 11 ole "github.com/gofiber/fiber/v2/internal/go-ole" 12 ) 13 14 // ConnectObject creates a connection point between two services for communication. 15 func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) { 16 unknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer) 17 if err != nil { 18 return 19 } 20 21 container := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown)) 22 var point *ole.IConnectionPoint 23 err = container.FindConnectionPoint(iid, &point) 24 if err != nil { 25 return 26 } 27 if edisp, ok := idisp.(*ole.IUnknown); ok { 28 cookie, err = point.Advise(edisp) 29 container.Release() 30 if err != nil { 31 return 32 } 33 } 34 rv := reflect.ValueOf(disp).Elem() 35 if rv.Type().Kind() == reflect.Struct { 36 dest := &stdDispatch{} 37 dest.lpVtbl = &stdDispatchVtbl{} 38 dest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface) 39 dest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef) 40 dest.lpVtbl.pRelease = syscall.NewCallback(dispRelease) 41 dest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount) 42 dest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo) 43 dest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames) 44 dest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke) 45 dest.iface = disp 46 dest.iid = iid 47 cookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest))) 48 container.Release() 49 if err != nil { 50 point.Release() 51 return 52 } 53 return 54 } 55 56 container.Release() 57 58 return 0, ole.NewError(ole.E_INVALIDARG) 59 }