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