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