iunknown.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package ole
  2. import "unsafe"
  3. type IUnknown struct {
  4. RawVTable *interface{}
  5. }
  6. type IUnknownVtbl struct {
  7. QueryInterface uintptr
  8. AddRef uintptr
  9. Release uintptr
  10. }
  11. type UnknownLike interface {
  12. QueryInterface(iid *GUID) (disp *IDispatch, err error)
  13. AddRef() int32
  14. Release() int32
  15. }
  16. func (v *IUnknown) VTable() *IUnknownVtbl {
  17. return (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable))
  18. }
  19. func (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error {
  20. return reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj)
  21. }
  22. func (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) {
  23. err = v.PutQueryInterface(interfaceID, &dispatch)
  24. return
  25. }
  26. func (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) {
  27. err = v.PutQueryInterface(interfaceID, &enum)
  28. return
  29. }
  30. func (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) {
  31. return queryInterface(v, iid)
  32. }
  33. func (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) {
  34. unk, err := queryInterface(v, iid)
  35. if err != nil {
  36. panic(err)
  37. }
  38. return unk
  39. }
  40. func (v *IUnknown) AddRef() int32 {
  41. return addRef(v)
  42. }
  43. func (v *IUnknown) Release() int32 {
  44. return release(v)
  45. }