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