| // +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 |
| } |