// +build windows package ole import ( "reflect" "syscall" "unsafe" ) func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { selfValue := reflect.ValueOf(self).Elem() objValue := reflect.ValueOf(obj).Elem() hr, _, _ := syscall.Syscall( method, 3, selfValue.UnsafeAddr(), uintptr(unsafe.Pointer(interfaceID)), objValue.Addr().Pointer()) if hr != 0 { err = NewError(hr) } return } func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { hr, _, _ := syscall.Syscall( unk.VTable().QueryInterface, 3, uintptr(unsafe.Pointer(unk)), uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(&disp))) if hr != 0 { err = NewError(hr) } return } func addRef(unk *IUnknown) int32 { ret, _, _ := syscall.Syscall( unk.VTable().AddRef, 1, uintptr(unsafe.Pointer(unk)), 0, 0) return int32(ret) } func release(unk *IUnknown) int32 { ret, _, _ := syscall.Syscall( unk.VTable().Release, 1, uintptr(unsafe.Pointer(unk)), 0, 0) return int32(ret) }