1
0

winrt.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // +build windows
  2. package ole
  3. import (
  4. "reflect"
  5. "syscall"
  6. "unicode/utf8"
  7. "unsafe"
  8. )
  9. var (
  10. procRoInitialize = modcombase.NewProc("RoInitialize")
  11. procRoActivateInstance = modcombase.NewProc("RoActivateInstance")
  12. procRoGetActivationFactory = modcombase.NewProc("RoGetActivationFactory")
  13. procWindowsCreateString = modcombase.NewProc("WindowsCreateString")
  14. procWindowsDeleteString = modcombase.NewProc("WindowsDeleteString")
  15. procWindowsGetStringRawBuffer = modcombase.NewProc("WindowsGetStringRawBuffer")
  16. )
  17. func RoInitialize(thread_type uint32) (err error) {
  18. hr, _, _ := procRoInitialize.Call(uintptr(thread_type))
  19. if hr != 0 {
  20. err = NewError(hr)
  21. }
  22. return
  23. }
  24. func RoActivateInstance(clsid string) (ins *IInspectable, err error) {
  25. hClsid, err := NewHString(clsid)
  26. if err != nil {
  27. return nil, err
  28. }
  29. defer DeleteHString(hClsid)
  30. hr, _, _ := procRoActivateInstance.Call(
  31. uintptr(unsafe.Pointer(hClsid)),
  32. uintptr(unsafe.Pointer(&ins)))
  33. if hr != 0 {
  34. err = NewError(hr)
  35. }
  36. return
  37. }
  38. func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) {
  39. hClsid, err := NewHString(clsid)
  40. if err != nil {
  41. return nil, err
  42. }
  43. defer DeleteHString(hClsid)
  44. hr, _, _ := procRoGetActivationFactory.Call(
  45. uintptr(unsafe.Pointer(hClsid)),
  46. uintptr(unsafe.Pointer(iid)),
  47. uintptr(unsafe.Pointer(&ins)))
  48. if hr != 0 {
  49. err = NewError(hr)
  50. }
  51. return
  52. }
  53. // HString is handle string for pointers.
  54. type HString uintptr
  55. // NewHString returns a new HString for Go string.
  56. func NewHString(s string) (hstring HString, err error) {
  57. u16 := syscall.StringToUTF16Ptr(s)
  58. len := uint32(utf8.RuneCountInString(s))
  59. hr, _, _ := procWindowsCreateString.Call(
  60. uintptr(unsafe.Pointer(u16)),
  61. uintptr(len),
  62. uintptr(unsafe.Pointer(&hstring)))
  63. if hr != 0 {
  64. err = NewError(hr)
  65. }
  66. return
  67. }
  68. // DeleteHString deletes HString.
  69. func DeleteHString(hstring HString) (err error) {
  70. hr, _, _ := procWindowsDeleteString.Call(uintptr(hstring))
  71. if hr != 0 {
  72. err = NewError(hr)
  73. }
  74. return
  75. }
  76. // String returns Go string value of HString.
  77. func (h HString) String() string {
  78. var u16buf uintptr
  79. var u16len uint32
  80. u16buf, _, _ = procWindowsGetStringRawBuffer.Call(
  81. uintptr(h),
  82. uintptr(unsafe.Pointer(&u16len)))
  83. u16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)}
  84. u16 := *(*[]uint16)(unsafe.Pointer(&u16hdr))
  85. return syscall.UTF16ToString(u16)
  86. }