58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
|
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)
|
||
|
}
|