59 lines
1.0 KiB
Go
59 lines
1.0 KiB
Go
// +build windows
|
|
|
|
package ole
|
|
|
|
import (
|
|
"reflect"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) {
|
|
selfValue := reflect.ValueOf(self).Elem()
|
|
objValue := reflect.ValueOf(obj).Elem()
|
|
|
|
hr, _, _ := syscall.Syscall(
|
|
method,
|
|
3,
|
|
selfValue.UnsafeAddr(),
|
|
uintptr(unsafe.Pointer(interfaceID)),
|
|
objValue.Addr().Pointer())
|
|
if hr != 0 {
|
|
err = NewError(hr)
|
|
}
|
|
return
|
|
}
|
|
|
|
func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) {
|
|
hr, _, _ := syscall.Syscall(
|
|
unk.VTable().QueryInterface,
|
|
3,
|
|
uintptr(unsafe.Pointer(unk)),
|
|
uintptr(unsafe.Pointer(iid)),
|
|
uintptr(unsafe.Pointer(&disp)))
|
|
if hr != 0 {
|
|
err = NewError(hr)
|
|
}
|
|
return
|
|
}
|
|
|
|
func addRef(unk *IUnknown) int32 {
|
|
ret, _, _ := syscall.Syscall(
|
|
unk.VTable().AddRef,
|
|
1,
|
|
uintptr(unsafe.Pointer(unk)),
|
|
0,
|
|
0)
|
|
return int32(ret)
|
|
}
|
|
|
|
func release(unk *IUnknown) int32 {
|
|
ret, _, _ := syscall.Syscall(
|
|
unk.VTable().Release,
|
|
1,
|
|
uintptr(unsafe.Pointer(unk)),
|
|
0,
|
|
0)
|
|
return int32(ret)
|
|
}
|