73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
// +build windows
|
|
|
|
package ole
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"reflect"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
func (v *IInspectable) GetIids() (iids []*GUID, err error) {
|
|
var count uint32
|
|
var array uintptr
|
|
hr, _, _ := syscall.Syscall(
|
|
v.VTable().GetIIds,
|
|
3,
|
|
uintptr(unsafe.Pointer(v)),
|
|
uintptr(unsafe.Pointer(&count)),
|
|
uintptr(unsafe.Pointer(&array)))
|
|
if hr != 0 {
|
|
err = NewError(hr)
|
|
return
|
|
}
|
|
defer CoTaskMemFree(array)
|
|
|
|
iids = make([]*GUID, count)
|
|
byteCount := count * uint32(unsafe.Sizeof(GUID{}))
|
|
slicehdr := reflect.SliceHeader{Data: array, Len: int(byteCount), Cap: int(byteCount)}
|
|
byteSlice := *(*[]byte)(unsafe.Pointer(&slicehdr))
|
|
reader := bytes.NewReader(byteSlice)
|
|
for i := range iids {
|
|
guid := GUID{}
|
|
err = binary.Read(reader, binary.LittleEndian, &guid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
iids[i] = &guid
|
|
}
|
|
return
|
|
}
|
|
|
|
func (v *IInspectable) GetRuntimeClassName() (s string, err error) {
|
|
var hstring HString
|
|
hr, _, _ := syscall.Syscall(
|
|
v.VTable().GetRuntimeClassName,
|
|
2,
|
|
uintptr(unsafe.Pointer(v)),
|
|
uintptr(unsafe.Pointer(&hstring)),
|
|
0)
|
|
if hr != 0 {
|
|
err = NewError(hr)
|
|
return
|
|
}
|
|
s = hstring.String()
|
|
DeleteHString(hstring)
|
|
return
|
|
}
|
|
|
|
func (v *IInspectable) GetTrustLevel() (level uint32, err error) {
|
|
hr, _, _ := syscall.Syscall(
|
|
v.VTable().GetTrustLevel,
|
|
2,
|
|
uintptr(unsafe.Pointer(v)),
|
|
uintptr(unsafe.Pointer(&level)),
|
|
0)
|
|
if hr != 0 {
|
|
err = NewError(hr)
|
|
}
|
|
return
|
|
}
|