github.com/gofiber/fiber/v2@v2.47.0/internal/go-ole/iunknown_windows.go (about) 1 //go:build windows 2 // +build windows 3 4 package ole 5 6 import ( 7 "reflect" 8 "syscall" 9 "unsafe" 10 ) 11 12 func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { 13 selfValue := reflect.ValueOf(self).Elem() 14 objValue := reflect.ValueOf(obj).Elem() 15 16 hr, _, _ := syscall.Syscall( 17 method, 18 3, 19 selfValue.UnsafeAddr(), 20 uintptr(unsafe.Pointer(interfaceID)), 21 objValue.Addr().Pointer()) 22 if hr != 0 { 23 err = NewError(hr) 24 } 25 return 26 } 27 28 func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { 29 hr, _, _ := syscall.Syscall( 30 unk.VTable().QueryInterface, 31 3, 32 uintptr(unsafe.Pointer(unk)), 33 uintptr(unsafe.Pointer(iid)), 34 uintptr(unsafe.Pointer(&disp))) 35 if hr != 0 { 36 err = NewError(hr) 37 } 38 return 39 } 40 41 func addRef(unk *IUnknown) int32 { 42 ret, _, _ := syscall.Syscall( 43 unk.VTable().AddRef, 44 1, 45 uintptr(unsafe.Pointer(unk)), 46 0, 47 0) 48 return int32(ret) 49 } 50 51 func release(unk *IUnknown) int32 { 52 ret, _, _ := syscall.Syscall( 53 unk.VTable().Release, 54 1, 55 uintptr(unsafe.Pointer(unk)), 56 0, 57 0) 58 return int32(ret) 59 }