package ole import "unsafe" type IUnknown struct { RawVTable *interface{} } type IUnknownVtbl struct { QueryInterface uintptr AddRef uintptr Release uintptr } type UnknownLike interface { QueryInterface(iid *GUID) (disp *IDispatch, err error) AddRef() int32 Release() int32 } func (v *IUnknown) VTable() *IUnknownVtbl { return (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable)) } func (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error { return reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj) } func (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) { err = v.PutQueryInterface(interfaceID, &dispatch) return } func (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) { err = v.PutQueryInterface(interfaceID, &enum) return } func (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) { return queryInterface(v, iid) } func (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) { unk, err := queryInterface(v, iid) if err != nil { panic(err) } return unk } func (v *IUnknown) AddRef() int32 { return addRef(v) } func (v *IUnknown) Release() int32 { return release(v) }