github.com/gofiber/fiber/v2@v2.47.0/internal/go-ole/safearray_windows.go (about)

     1  //go:build windows
     2  // +build windows
     3  
     4  package ole
     5  
     6  import (
     7  	"unsafe"
     8  )
     9  
    10  var (
    11  	procSafeArrayAccessData        = modoleaut32.NewProc("SafeArrayAccessData")
    12  	procSafeArrayAllocData         = modoleaut32.NewProc("SafeArrayAllocData")
    13  	procSafeArrayAllocDescriptor   = modoleaut32.NewProc("SafeArrayAllocDescriptor")
    14  	procSafeArrayAllocDescriptorEx = modoleaut32.NewProc("SafeArrayAllocDescriptorEx")
    15  	procSafeArrayCopy              = modoleaut32.NewProc("SafeArrayCopy")
    16  	procSafeArrayCopyData          = modoleaut32.NewProc("SafeArrayCopyData")
    17  	procSafeArrayCreate            = modoleaut32.NewProc("SafeArrayCreate")
    18  	procSafeArrayCreateEx          = modoleaut32.NewProc("SafeArrayCreateEx")
    19  	procSafeArrayCreateVector      = modoleaut32.NewProc("SafeArrayCreateVector")
    20  	procSafeArrayCreateVectorEx    = modoleaut32.NewProc("SafeArrayCreateVectorEx")
    21  	procSafeArrayDestroy           = modoleaut32.NewProc("SafeArrayDestroy")
    22  	procSafeArrayDestroyData       = modoleaut32.NewProc("SafeArrayDestroyData")
    23  	procSafeArrayDestroyDescriptor = modoleaut32.NewProc("SafeArrayDestroyDescriptor")
    24  	procSafeArrayGetDim            = modoleaut32.NewProc("SafeArrayGetDim")
    25  	procSafeArrayGetElement        = modoleaut32.NewProc("SafeArrayGetElement")
    26  	procSafeArrayGetElemsize       = modoleaut32.NewProc("SafeArrayGetElemsize")
    27  	procSafeArrayGetIID            = modoleaut32.NewProc("SafeArrayGetIID")
    28  	procSafeArrayGetLBound         = modoleaut32.NewProc("SafeArrayGetLBound")
    29  	procSafeArrayGetUBound         = modoleaut32.NewProc("SafeArrayGetUBound")
    30  	procSafeArrayGetVartype        = modoleaut32.NewProc("SafeArrayGetVartype")
    31  	procSafeArrayLock              = modoleaut32.NewProc("SafeArrayLock")
    32  	procSafeArrayPtrOfIndex        = modoleaut32.NewProc("SafeArrayPtrOfIndex")
    33  	procSafeArrayUnaccessData      = modoleaut32.NewProc("SafeArrayUnaccessData")
    34  	procSafeArrayUnlock            = modoleaut32.NewProc("SafeArrayUnlock")
    35  	procSafeArrayPutElement        = modoleaut32.NewProc("SafeArrayPutElement")
    36  	//procSafeArrayRedim             = modoleaut32.NewProc("SafeArrayRedim") // TODO
    37  	//procSafeArraySetIID            = modoleaut32.NewProc("SafeArraySetIID") // TODO
    38  	procSafeArrayGetRecordInfo = modoleaut32.NewProc("SafeArrayGetRecordInfo")
    39  	procSafeArraySetRecordInfo = modoleaut32.NewProc("SafeArraySetRecordInfo")
    40  )
    41  
    42  // safeArrayAccessData returns raw array pointer.
    43  //
    44  // AKA: SafeArrayAccessData in Windows API.
    45  // Todo: Test
    46  func safeArrayAccessData(safearray *SafeArray) (element uintptr, err error) {
    47  	err = convertHresultToError(
    48  		procSafeArrayAccessData.Call(
    49  			uintptr(unsafe.Pointer(safearray)),
    50  			uintptr(unsafe.Pointer(&element))))
    51  	return
    52  }
    53  
    54  // safeArrayUnaccessData releases raw array.
    55  //
    56  // AKA: SafeArrayUnaccessData in Windows API.
    57  func safeArrayUnaccessData(safearray *SafeArray) (err error) {
    58  	err = convertHresultToError(procSafeArrayUnaccessData.Call(uintptr(unsafe.Pointer(safearray))))
    59  	return
    60  }
    61  
    62  // safeArrayAllocData allocates SafeArray.
    63  //
    64  // AKA: SafeArrayAllocData in Windows API.
    65  func safeArrayAllocData(safearray *SafeArray) (err error) {
    66  	err = convertHresultToError(procSafeArrayAllocData.Call(uintptr(unsafe.Pointer(safearray))))
    67  	return
    68  }
    69  
    70  // safeArrayAllocDescriptor allocates SafeArray.
    71  //
    72  // AKA: SafeArrayAllocDescriptor in Windows API.
    73  func safeArrayAllocDescriptor(dimensions uint32) (safearray *SafeArray, err error) {
    74  	err = convertHresultToError(
    75  		procSafeArrayAllocDescriptor.Call(uintptr(dimensions), uintptr(unsafe.Pointer(&safearray))))
    76  	return
    77  }
    78  
    79  // safeArrayAllocDescriptorEx allocates SafeArray.
    80  //
    81  // AKA: SafeArrayAllocDescriptorEx in Windows API.
    82  func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (safearray *SafeArray, err error) {
    83  	err = convertHresultToError(
    84  		procSafeArrayAllocDescriptorEx.Call(
    85  			uintptr(variantType),
    86  			uintptr(dimensions),
    87  			uintptr(unsafe.Pointer(&safearray))))
    88  	return
    89  }
    90  
    91  // safeArrayCopy returns copy of SafeArray.
    92  //
    93  // AKA: SafeArrayCopy in Windows API.
    94  func safeArrayCopy(original *SafeArray) (safearray *SafeArray, err error) {
    95  	err = convertHresultToError(
    96  		procSafeArrayCopy.Call(
    97  			uintptr(unsafe.Pointer(original)),
    98  			uintptr(unsafe.Pointer(&safearray))))
    99  	return
   100  }
   101  
   102  // safeArrayCopyData duplicates SafeArray into another SafeArray object.
   103  //
   104  // AKA: SafeArrayCopyData in Windows API.
   105  func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) (err error) {
   106  	err = convertHresultToError(
   107  		procSafeArrayCopyData.Call(
   108  			uintptr(unsafe.Pointer(original)),
   109  			uintptr(unsafe.Pointer(duplicate))))
   110  	return
   111  }
   112  
   113  // safeArrayCreate creates SafeArray.
   114  //
   115  // AKA: SafeArrayCreate in Windows API.
   116  func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (safearray *SafeArray, err error) {
   117  	sa, _, err := procSafeArrayCreate.Call(
   118  		uintptr(variantType),
   119  		uintptr(dimensions),
   120  		uintptr(unsafe.Pointer(bounds)))
   121  	safearray = (*SafeArray)(unsafe.Pointer(&sa))
   122  	return
   123  }
   124  
   125  // safeArrayCreateEx creates SafeArray.
   126  //
   127  // AKA: SafeArrayCreateEx in Windows API.
   128  func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (safearray *SafeArray, err error) {
   129  	sa, _, err := procSafeArrayCreateEx.Call(
   130  		uintptr(variantType),
   131  		uintptr(dimensions),
   132  		uintptr(unsafe.Pointer(bounds)),
   133  		extra)
   134  	safearray = (*SafeArray)(unsafe.Pointer(sa))
   135  	return
   136  }
   137  
   138  // safeArrayCreateVector creates SafeArray.
   139  //
   140  // AKA: SafeArrayCreateVector in Windows API.
   141  func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (safearray *SafeArray, err error) {
   142  	sa, _, err := procSafeArrayCreateVector.Call(
   143  		uintptr(variantType),
   144  		uintptr(lowerBound),
   145  		uintptr(length))
   146  	safearray = (*SafeArray)(unsafe.Pointer(sa))
   147  	return
   148  }
   149  
   150  // safeArrayCreateVectorEx creates SafeArray.
   151  //
   152  // AKA: SafeArrayCreateVectorEx in Windows API.
   153  func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (safearray *SafeArray, err error) {
   154  	sa, _, err := procSafeArrayCreateVectorEx.Call(
   155  		uintptr(variantType),
   156  		uintptr(lowerBound),
   157  		uintptr(length),
   158  		extra)
   159  	safearray = (*SafeArray)(unsafe.Pointer(sa))
   160  	return
   161  }
   162  
   163  // safeArrayDestroy destroys SafeArray object.
   164  //
   165  // AKA: SafeArrayDestroy in Windows API.
   166  func safeArrayDestroy(safearray *SafeArray) (err error) {
   167  	err = convertHresultToError(procSafeArrayDestroy.Call(uintptr(unsafe.Pointer(safearray))))
   168  	return
   169  }
   170  
   171  // safeArrayDestroyData destroys SafeArray object.
   172  //
   173  // AKA: SafeArrayDestroyData in Windows API.
   174  func safeArrayDestroyData(safearray *SafeArray) (err error) {
   175  	err = convertHresultToError(procSafeArrayDestroyData.Call(uintptr(unsafe.Pointer(safearray))))
   176  	return
   177  }
   178  
   179  // safeArrayDestroyDescriptor destroys SafeArray object.
   180  //
   181  // AKA: SafeArrayDestroyDescriptor in Windows API.
   182  func safeArrayDestroyDescriptor(safearray *SafeArray) (err error) {
   183  	err = convertHresultToError(procSafeArrayDestroyDescriptor.Call(uintptr(unsafe.Pointer(safearray))))
   184  	return
   185  }
   186  
   187  // safeArrayGetDim is the amount of dimensions in the SafeArray.
   188  //
   189  // SafeArrays may have multiple dimensions. Meaning, it could be
   190  // multidimensional array.
   191  //
   192  // AKA: SafeArrayGetDim in Windows API.
   193  func safeArrayGetDim(safearray *SafeArray) (dimensions *uint32, err error) {
   194  	l, _, err := procSafeArrayGetDim.Call(uintptr(unsafe.Pointer(safearray)))
   195  	dimensions = (*uint32)(unsafe.Pointer(l))
   196  	return
   197  }
   198  
   199  // safeArrayGetElementSize is the element size in bytes.
   200  //
   201  // AKA: SafeArrayGetElemsize in Windows API.
   202  func safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) {
   203  	l, _, err := procSafeArrayGetElemsize.Call(uintptr(unsafe.Pointer(safearray)))
   204  	length = (*uint32)(unsafe.Pointer(l))
   205  	return
   206  }
   207  
   208  // safeArrayGetElement retrieves element at given index.
   209  func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error {
   210  	return convertHresultToError(
   211  		procSafeArrayGetElement.Call(
   212  			uintptr(unsafe.Pointer(safearray)),
   213  			uintptr(unsafe.Pointer(&index)),
   214  			uintptr(pv)))
   215  }
   216  
   217  // safeArrayGetElementString retrieves element at given index and converts to string.
   218  func safeArrayGetElementString(safearray *SafeArray, index int32) (str string, err error) {
   219  	var element *int16
   220  	err = convertHresultToError(
   221  		procSafeArrayGetElement.Call(
   222  			uintptr(unsafe.Pointer(safearray)),
   223  			uintptr(unsafe.Pointer(&index)),
   224  			uintptr(unsafe.Pointer(&element))))
   225  	str = BstrToString(*(**uint16)(unsafe.Pointer(&element)))
   226  	SysFreeString(element)
   227  	return
   228  }
   229  
   230  // safeArrayGetIID is the InterfaceID of the elements in the SafeArray.
   231  //
   232  // AKA: SafeArrayGetIID in Windows API.
   233  func safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) {
   234  	err = convertHresultToError(
   235  		procSafeArrayGetIID.Call(
   236  			uintptr(unsafe.Pointer(safearray)),
   237  			uintptr(unsafe.Pointer(&guid))))
   238  	return
   239  }
   240  
   241  // safeArrayGetLBound returns lower bounds of SafeArray.
   242  //
   243  // SafeArrays may have multiple dimensions. Meaning, it could be
   244  // multidimensional array.
   245  //
   246  // AKA: SafeArrayGetLBound in Windows API.
   247  func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int32, err error) {
   248  	err = convertHresultToError(
   249  		procSafeArrayGetLBound.Call(
   250  			uintptr(unsafe.Pointer(safearray)),
   251  			uintptr(dimension),
   252  			uintptr(unsafe.Pointer(&lowerBound))))
   253  	return
   254  }
   255  
   256  // safeArrayGetUBound returns upper bounds of SafeArray.
   257  //
   258  // SafeArrays may have multiple dimensions. Meaning, it could be
   259  // multidimensional array.
   260  //
   261  // AKA: SafeArrayGetUBound in Windows API.
   262  func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int32, err error) {
   263  	err = convertHresultToError(
   264  		procSafeArrayGetUBound.Call(
   265  			uintptr(unsafe.Pointer(safearray)),
   266  			uintptr(dimension),
   267  			uintptr(unsafe.Pointer(&upperBound))))
   268  	return
   269  }
   270  
   271  // safeArrayGetVartype returns data type of SafeArray.
   272  //
   273  // AKA: SafeArrayGetVartype in Windows API.
   274  func safeArrayGetVartype(safearray *SafeArray) (varType uint16, err error) {
   275  	err = convertHresultToError(
   276  		procSafeArrayGetVartype.Call(
   277  			uintptr(unsafe.Pointer(safearray)),
   278  			uintptr(unsafe.Pointer(&varType))))
   279  	return
   280  }
   281  
   282  // safeArrayLock locks SafeArray for reading to modify SafeArray.
   283  //
   284  // This must be called during some calls to ensure that another process does not
   285  // read or write to the SafeArray during editing.
   286  //
   287  // AKA: SafeArrayLock in Windows API.
   288  func safeArrayLock(safearray *SafeArray) (err error) {
   289  	err = convertHresultToError(procSafeArrayLock.Call(uintptr(unsafe.Pointer(safearray))))
   290  	return
   291  }
   292  
   293  // safeArrayUnlock unlocks SafeArray for reading.
   294  //
   295  // AKA: SafeArrayUnlock in Windows API.
   296  func safeArrayUnlock(safearray *SafeArray) (err error) {
   297  	err = convertHresultToError(procSafeArrayUnlock.Call(uintptr(unsafe.Pointer(safearray))))
   298  	return
   299  }
   300  
   301  // safeArrayPutElement stores the data element at the specified location in the
   302  // array.
   303  //
   304  // AKA: SafeArrayPutElement in Windows API.
   305  func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) (err error) {
   306  	err = convertHresultToError(
   307  		procSafeArrayPutElement.Call(
   308  			uintptr(unsafe.Pointer(safearray)),
   309  			uintptr(unsafe.Pointer(&index)),
   310  			uintptr(unsafe.Pointer(element))))
   311  	return
   312  }
   313  
   314  // safeArrayGetRecordInfo accesses IRecordInfo info for custom types.
   315  //
   316  // AKA: SafeArrayGetRecordInfo in Windows API.
   317  //
   318  // XXX: Must implement IRecordInfo interface for this to return.
   319  func safeArrayGetRecordInfo(safearray *SafeArray) (recordInfo interface{}, err error) {
   320  	err = convertHresultToError(
   321  		procSafeArrayGetRecordInfo.Call(
   322  			uintptr(unsafe.Pointer(safearray)),
   323  			uintptr(unsafe.Pointer(&recordInfo))))
   324  	return
   325  }
   326  
   327  // safeArraySetRecordInfo mutates IRecordInfo info for custom types.
   328  //
   329  // AKA: SafeArraySetRecordInfo in Windows API.
   330  //
   331  // XXX: Must implement IRecordInfo interface for this to return.
   332  func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) (err error) {
   333  	err = convertHresultToError(
   334  		procSafeArraySetRecordInfo.Call(
   335  			uintptr(unsafe.Pointer(safearray)),
   336  			uintptr(unsafe.Pointer(&recordInfo))))
   337  	return
   338  }