| // +build windows |
| |
| package ole |
| |
| import ( |
| "reflect" |
| "syscall" |
| "unicode/utf8" |
| "unsafe" |
| ) |
| |
| var ( |
| procRoInitialize = modcombase.NewProc("RoInitialize") |
| procRoActivateInstance = modcombase.NewProc("RoActivateInstance") |
| procRoGetActivationFactory = modcombase.NewProc("RoGetActivationFactory") |
| procWindowsCreateString = modcombase.NewProc("WindowsCreateString") |
| procWindowsDeleteString = modcombase.NewProc("WindowsDeleteString") |
| procWindowsGetStringRawBuffer = modcombase.NewProc("WindowsGetStringRawBuffer") |
| ) |
| |
| func RoInitialize(thread_type uint32) (err error) { |
| hr, _, _ := procRoInitialize.Call(uintptr(thread_type)) |
| if hr != 0 { |
| err = NewError(hr) |
| } |
| return |
| } |
| |
| func RoActivateInstance(clsid string) (ins *IInspectable, err error) { |
| hClsid, err := NewHString(clsid) |
| if err != nil { |
| return nil, err |
| } |
| defer DeleteHString(hClsid) |
| |
| hr, _, _ := procRoActivateInstance.Call( |
| uintptr(unsafe.Pointer(hClsid)), |
| uintptr(unsafe.Pointer(&ins))) |
| if hr != 0 { |
| err = NewError(hr) |
| } |
| return |
| } |
| |
| func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { |
| hClsid, err := NewHString(clsid) |
| if err != nil { |
| return nil, err |
| } |
| defer DeleteHString(hClsid) |
| |
| hr, _, _ := procRoGetActivationFactory.Call( |
| uintptr(unsafe.Pointer(hClsid)), |
| uintptr(unsafe.Pointer(iid)), |
| uintptr(unsafe.Pointer(&ins))) |
| if hr != 0 { |
| err = NewError(hr) |
| } |
| return |
| } |
| |
| // HString is handle string for pointers. |
| type HString uintptr |
| |
| // NewHString returns a new HString for Go string. |
| func NewHString(s string) (hstring HString, err error) { |
| u16 := syscall.StringToUTF16Ptr(s) |
| len := uint32(utf8.RuneCountInString(s)) |
| hr, _, _ := procWindowsCreateString.Call( |
| uintptr(unsafe.Pointer(u16)), |
| uintptr(len), |
| uintptr(unsafe.Pointer(&hstring))) |
| if hr != 0 { |
| err = NewError(hr) |
| } |
| return |
| } |
| |
| // DeleteHString deletes HString. |
| func DeleteHString(hstring HString) (err error) { |
| hr, _, _ := procWindowsDeleteString.Call(uintptr(hstring)) |
| if hr != 0 { |
| err = NewError(hr) |
| } |
| return |
| } |
| |
| // String returns Go string value of HString. |
| func (h HString) String() string { |
| var u16buf uintptr |
| var u16len uint32 |
| u16buf, _, _ = procWindowsGetStringRawBuffer.Call( |
| uintptr(h), |
| uintptr(unsafe.Pointer(&u16len))) |
| |
| u16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)} |
| u16 := *(*[]uint16)(unsafe.Pointer(&u16hdr)) |
| return syscall.UTF16ToString(u16) |
| } |