iunknown_windows.go 1.0 KB

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