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  }