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 }