aboutsummaryrefslogtreecommitdiff
path: root/src/libs/wcautil/WixToolset.WcaUtil/inc
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2021-05-11 07:38:50 -0700
committerRob Mensching <rob@firegiant.com>2021-05-11 07:38:50 -0700
commitcb49308d18e998e96bbe9e259e815128f7fc2abc (patch)
treea5203b99de14ec36862f00e1b40ee71e53add911 /src/libs/wcautil/WixToolset.WcaUtil/inc
parent0c6aea2de8db1258949a741b1c504307a81bf579 (diff)
parent30827588eb0c189b7e2d04693d116080d333200e (diff)
downloadwix-cb49308d18e998e96bbe9e259e815128f7fc2abc.tar.gz
wix-cb49308d18e998e96bbe9e259e815128f7fc2abc.tar.bz2
wix-cb49308d18e998e96bbe9e259e815128f7fc2abc.zip
Merge wcautil
Diffstat (limited to 'src/libs/wcautil/WixToolset.WcaUtil/inc')
-rw-r--r--src/libs/wcautil/WixToolset.WcaUtil/inc/wcalog.h14
-rw-r--r--src/libs/wcautil/WixToolset.WcaUtil/inc/wcautil.h397
-rw-r--r--src/libs/wcautil/WixToolset.WcaUtil/inc/wcawow64.h20
-rw-r--r--src/libs/wcautil/WixToolset.WcaUtil/inc/wcawrapquery.h130
4 files changed, 561 insertions, 0 deletions
diff --git a/src/libs/wcautil/WixToolset.WcaUtil/inc/wcalog.h b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcalog.h
new file mode 100644
index 00000000..ffa3fa03
--- /dev/null
+++ b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcalog.h
@@ -0,0 +1,14 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9BOOL WIXAPI IsVerboseLogging();
10HRESULT WIXAPI SetVerboseLoggingAtom(BOOL bValue);
11
12#ifdef __cplusplus
13}
14#endif
diff --git a/src/libs/wcautil/WixToolset.WcaUtil/inc/wcautil.h b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcautil.h
new file mode 100644
index 00000000..4d036a9d
--- /dev/null
+++ b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcautil.h
@@ -0,0 +1,397 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9#include "dutilsources.h"
10
11#define WIXAPI __stdcall
12#ifndef DUTIL_SOURCE_DEFAULT
13#define DUTIL_SOURCE_DEFAULT DUTIL_SOURCE_EXTERNAL
14#endif
15
16#include "dutil.h"
17
18#define MessageExitOnLastErrorSource(d, x, e, s, ...) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTraceSource(d, x, "%s", s, __VA_ARGS__); WcaErrorMessage(e, x, MB_OK, -1, __VA_ARGS__); goto LExit; } }
19#define MessageExitOnFailureSource(d, x, e, s, ...) if (FAILED(x)) { ExitTraceSource(d, x, "%s", s, __VA_ARGS__); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, -1, __VA_ARGS__); goto LExit; }
20#define MessageExitOnNullWithLastErrorSource(d, p, x, e, s, ...) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTraceSource(d, x, "%s", s, __VA_ARGS__); WcaErrorMessage(e, x, MB_OK, -1, __VA_ARGS__); goto LExit; }
21
22#define MessageExitOnLastError(x, e, s, ...) MessageExitOnLastErrorSource(DUTIL_SOURCE_DEFAULT, x, e, s, __VA_ARGS__)
23#define MessageExitOnFailure(x, e, s, ...) MessageExitOnFailureSource(DUTIL_SOURCE_DEFAULT, x, e, s, __VA_ARGS__)
24#define MessageExitOnNullWithLastError(p, x, e, s, ...) MessageExitOnNullWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__)
25
26// Generic action enum.
27typedef enum WCA_ACTION
28{
29 WCA_ACTION_NONE,
30 WCA_ACTION_INSTALL,
31 WCA_ACTION_UNINSTALL,
32} WCA_ACTION;
33
34typedef enum WCA_CASCRIPT
35{
36 WCA_CASCRIPT_SCHEDULED,
37 WCA_CASCRIPT_ROLLBACK,
38} WCA_CASCRIPT;
39
40typedef enum WCA_CASCRIPT_CLOSE
41{
42 WCA_CASCRIPT_CLOSE_PRESERVE,
43 WCA_CASCRIPT_CLOSE_DELETE,
44} WCA_CASCRIPT_CLOSE;
45
46typedef enum WCA_TODO
47{
48 WCA_TODO_UNKNOWN,
49 WCA_TODO_INSTALL,
50 WCA_TODO_UNINSTALL,
51 WCA_TODO_REINSTALL,
52} WCA_TODO;
53
54typedef struct WCA_CASCRIPT_STRUCT
55{
56 LPWSTR pwzScriptPath;
57 HANDLE hScriptFile;
58} *WCA_CASCRIPT_HANDLE;
59
60typedef enum WCA_ENCODING
61{
62 WCA_ENCODING_UNKNOWN,
63 WCA_ENCODING_UTF_16,
64 WCA_ENCODING_UTF_8,
65 WCA_ENCODING_ANSI,
66} WCA_ENCODING;
67
68void WIXAPI WcaGlobalInitialize(
69 __in HINSTANCE hInst
70 );
71void WIXAPI WcaGlobalFinalize();
72
73HRESULT WIXAPI WcaInitialize(
74 __in MSIHANDLE hInstall,
75 __in_z PCSTR szCustomActionLogName
76 );
77UINT WIXAPI WcaFinalize(
78 __in UINT iReturnValue
79 );
80BOOL WIXAPI WcaIsInitialized();
81
82MSIHANDLE WIXAPI WcaGetInstallHandle();
83MSIHANDLE WIXAPI WcaGetDatabaseHandle();
84
85const char* WIXAPI WcaGetLogName();
86
87void WIXAPI WcaSetReturnValue(
88 __in UINT iReturnValue
89 );
90BOOL WIXAPI WcaCancelDetected();
91
92#define LOG_BUFFER 2048
93typedef enum LOGLEVEL
94{
95 LOGMSG_TRACEONLY, // Never written to the log file (except in DEBUG builds)
96 LOGMSG_VERBOSE, // Written to log when LOGVERBOSE
97 LOGMSG_STANDARD // Written to log whenever informational logging is enabled
98} LOGLEVEL;
99
100void __cdecl WcaLog(
101 __in LOGLEVEL llv,
102 __in_z __format_string PCSTR fmt, ...
103 );
104BOOL WIXAPI WcaDisplayAssert(
105 __in LPCSTR sz
106 );
107void __cdecl WcaLogError(
108 __in HRESULT hr,
109 __in LPCSTR szMessage,
110 ...
111 );
112void WIXAPI WcaLogErrorArgs(
113 __in HRESULT hr,
114 __in LPCSTR szMessage,
115 __in va_list args
116 );
117
118UINT WIXAPI WcaProcessMessage(
119 __in INSTALLMESSAGE eMessageType,
120 __in MSIHANDLE hRecord
121 );
122UINT __cdecl WcaErrorMessage(
123 __in int iError,
124 __in HRESULT hrError,
125 __in UINT uiType,
126 __in INT cArgs,
127 ...
128 );
129HRESULT WIXAPI WcaProgressMessage(
130 __in UINT uiCost,
131 __in BOOL fExtendProgressBar
132 );
133
134BOOL WIXAPI WcaIsInstalling(
135 __in INSTALLSTATE isInstalled,
136 __in INSTALLSTATE isAction
137 );
138BOOL WIXAPI WcaIsReInstalling(
139 __in INSTALLSTATE isInstalled,
140 __in INSTALLSTATE isAction
141 );
142BOOL WIXAPI WcaIsUninstalling(
143 __in INSTALLSTATE isInstalled,
144 __in INSTALLSTATE isAction
145 );
146
147HRESULT WIXAPI WcaSetComponentState(
148 __in_z LPCWSTR wzComponent,
149 __in INSTALLSTATE isState
150 );
151
152HRESULT WIXAPI WcaTableExists(
153 __in_z LPCWSTR wzTable
154 );
155
156HRESULT WIXAPI WcaOpenView(
157 __in_z LPCWSTR wzSql,
158 __out MSIHANDLE* phView
159 );
160HRESULT WIXAPI WcaExecuteView(
161 __in MSIHANDLE hView,
162 __in MSIHANDLE hRec
163 );
164HRESULT WIXAPI WcaOpenExecuteView(
165 __in_z LPCWSTR wzSql,
166 __out MSIHANDLE* phView
167 );
168HRESULT WIXAPI WcaFetchRecord(
169 __in MSIHANDLE hView,
170 __out MSIHANDLE* phRec
171 );
172HRESULT WIXAPI WcaFetchSingleRecord(
173 __in MSIHANDLE hView,
174 __out MSIHANDLE* phRec
175 );
176
177HRESULT WIXAPI WcaGetProperty(
178 __in_z LPCWSTR wzProperty,
179 __inout LPWSTR* ppwzData
180 );
181HRESULT WIXAPI WcaGetFormattedProperty(
182 __in_z LPCWSTR wzProperty,
183 __out LPWSTR* ppwzData
184 );
185HRESULT WIXAPI WcaGetFormattedString(
186 __in_z LPCWSTR wzString,
187 __out LPWSTR* ppwzData
188 );
189HRESULT WIXAPI WcaGetIntProperty(
190 __in_z LPCWSTR wzProperty,
191 __inout int* piData
192 );
193HRESULT WIXAPI WcaGetTargetPath(
194 __in_z LPCWSTR wzFolder,
195 __out LPWSTR* ppwzData
196 );
197HRESULT WIXAPI WcaSetProperty(
198 __in_z LPCWSTR wzPropertyName,
199 __in_z LPCWSTR wzPropertyValue
200 );
201HRESULT WIXAPI WcaSetIntProperty(
202 __in_z LPCWSTR wzPropertyName,
203 __in int nPropertyValue
204 );
205BOOL WIXAPI WcaIsPropertySet(
206 __in LPCSTR szProperty
207 );
208BOOL WIXAPI WcaIsUnicodePropertySet(
209 __in LPCWSTR wzProperty
210 );
211
212HRESULT WIXAPI WcaGetRecordInteger(
213 __in MSIHANDLE hRec,
214 __in UINT uiField,
215 __inout int* piData
216 );
217HRESULT WIXAPI WcaGetRecordString(
218 __in MSIHANDLE hRec,
219 __in UINT uiField,
220 __inout LPWSTR* ppwzData
221 );
222HRESULT WIXAPI WcaGetRecordFormattedInteger(
223 __in MSIHANDLE hRec,
224 __in UINT uiField,
225 __out int* piData
226 );
227HRESULT WIXAPI WcaGetRecordFormattedString(
228 __in MSIHANDLE hRec,
229 __in UINT uiField,
230 __inout LPWSTR* ppwzData
231 );
232
233HRESULT WIXAPI WcaAllocStream(
234 __deref_out_bcount_part(cbData, 0) BYTE** ppbData,
235 __in SIZE_T cbData
236 );
237HRESULT WIXAPI WcaFreeStream(
238 __in BYTE* pbData
239 );
240
241HRESULT WIXAPI WcaGetRecordStream(
242 __in MSIHANDLE hRecBinary,
243 __in UINT uiField,
244 __deref_out_bcount_full(*pcbData) BYTE** ppbData,
245 __out DWORD* pcbData
246 );
247HRESULT WIXAPI WcaSetRecordString(
248 __in MSIHANDLE hRec,
249 __in UINT uiField,
250 __in_z LPCWSTR wzData
251 );
252HRESULT WIXAPI WcaSetRecordInteger(
253 __in MSIHANDLE hRec,
254 __in UINT uiField,
255 __in int iValue
256 );
257
258HRESULT WIXAPI WcaDoDeferredAction(
259 __in_z LPCWSTR wzAction,
260 __in_z LPCWSTR wzCustomActionData,
261 __in UINT uiCost
262 );
263DWORD WIXAPI WcaCountOfCustomActionDataRecords(
264 __in_z LPCWSTR wzData
265 );
266
267HRESULT WIXAPI WcaReadStringFromCaData(
268 __deref_in LPWSTR* ppwzCustomActionData,
269 __deref_out_z LPWSTR* ppwzString
270 );
271HRESULT WIXAPI WcaReadIntegerFromCaData(
272 __deref_in LPWSTR* ppwzCustomActionData,
273 __out int* piResult
274 );
275HRESULT WIXAPI WcaReadStreamFromCaData(
276 __deref_in LPWSTR* ppwzCustomActionData,
277 __deref_out_bcount(*pcbData) BYTE** ppbData,
278 __out DWORD_PTR* pcbData
279 );
280HRESULT WIXAPI WcaWriteStringToCaData(
281 __in_z LPCWSTR wzString,
282 __deref_inout_z LPWSTR* ppwzCustomActionData
283 );
284HRESULT WIXAPI WcaWriteIntegerToCaData(
285 __in int i,
286 __deref_out_z_opt LPWSTR* ppwzCustomActionData
287 );
288HRESULT WIXAPI WcaWriteStreamToCaData(
289 __in_bcount(cbData) const BYTE* pbData,
290 __in SIZE_T cbData,
291 __deref_inout_z_opt LPWSTR* ppwzCustomActionData
292 );
293
294HRESULT __cdecl WcaAddTempRecord(
295 __inout MSIHANDLE* phTableView,
296 __inout MSIHANDLE* phColumns,
297 __in_z LPCWSTR wzTable,
298 __out_opt MSIDBERROR* pdbError,
299 __in UINT uiUniquifyColumn,
300 __in UINT cColumns,
301 ...
302 );
303
304HRESULT WIXAPI WcaDumpTable(
305 __in_z LPCWSTR wzTable
306 );
307
308HRESULT WIXAPI WcaDeferredActionRequiresReboot();
309BOOL WIXAPI WcaDidDeferredActionRequireReboot();
310
311HRESULT WIXAPI WcaCaScriptCreateKey(
312 __out LPWSTR* ppwzScriptKey
313 );
314
315HRESULT WIXAPI WcaCaScriptCreate(
316 __in WCA_ACTION action,
317 __in WCA_CASCRIPT script,
318 __in BOOL fImpersonated,
319 __in_z LPCWSTR wzScriptKey,
320 __in BOOL fAppend,
321 __out WCA_CASCRIPT_HANDLE* phScript
322 );
323
324HRESULT WIXAPI WcaCaScriptOpen(
325 __in WCA_ACTION action,
326 __in WCA_CASCRIPT script,
327 __in BOOL fImpersonated,
328 __in_z LPCWSTR wzScriptKey,
329 __out WCA_CASCRIPT_HANDLE* phScript
330 );
331
332void WIXAPI WcaCaScriptClose(
333 __in_opt WCA_CASCRIPT_HANDLE hScript,
334 __in WCA_CASCRIPT_CLOSE closeOperation
335 );
336
337HRESULT WIXAPI WcaCaScriptReadAsCustomActionData(
338 __in WCA_CASCRIPT_HANDLE hScript,
339 __out LPWSTR* ppwzCustomActionData
340 );
341
342HRESULT WIXAPI WcaCaScriptWriteString(
343 __in WCA_CASCRIPT_HANDLE hScript,
344 __in_z LPCWSTR wzValue
345 );
346
347HRESULT WIXAPI WcaCaScriptWriteNumber(
348 __in WCA_CASCRIPT_HANDLE hScript,
349 __in DWORD dwValue
350 );
351
352void WIXAPI WcaCaScriptFlush(
353 __in WCA_CASCRIPT_HANDLE hScript
354 );
355
356void WIXAPI WcaCaScriptCleanup(
357 __in_z LPCWSTR wzProductCode,
358 __in BOOL fImpersonated
359 );
360
361HRESULT WIXAPI QuietExec(
362 __inout_z LPWSTR wzCommand,
363 __in DWORD dwTimeout,
364 __in BOOL fLogCommand,
365 __in BOOL fLogOutput
366 );
367
368HRESULT WIXAPI QuietExecCapture(
369 __inout_z LPWSTR wzCommand,
370 __in DWORD dwTimeout,
371 __in BOOL fLogCommand,
372 __in BOOL fLogOutput,
373 __out_z_opt LPWSTR* psczOutput
374 );
375
376WCA_TODO WIXAPI WcaGetComponentToDo(
377 __in_z LPCWSTR wzComponentId
378 );
379
380HRESULT WIXAPI WcaExtractBinaryToBuffer(
381 __in LPCWSTR wzBinaryId,
382 __out BYTE** pbData,
383 __out DWORD* pcbData
384 );
385HRESULT WIXAPI WcaExtractBinaryToFile(
386 __in LPCWSTR wzBinaryId,
387 __in LPCWSTR wzPath
388 );
389HRESULT WIXAPI WcaExtractBinaryToString(
390 __in LPCWSTR wzBinaryId,
391 __deref_out_z LPWSTR* psczOutput,
392 __out WCA_ENCODING* encoding
393 );
394
395#ifdef __cplusplus
396}
397#endif
diff --git a/src/libs/wcautil/WixToolset.WcaUtil/inc/wcawow64.h b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcawow64.h
new file mode 100644
index 00000000..dd55f3fd
--- /dev/null
+++ b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcawow64.h
@@ -0,0 +1,20 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "wcautil.h"
6
7#ifdef __cplusplus
8extern "C" {
9#endif
10
11HRESULT WIXAPI WcaInitializeWow64();
12BOOL WIXAPI WcaIsWow64Process();
13BOOL WIXAPI WcaIsWow64Initialized();
14HRESULT WIXAPI WcaDisableWow64FSRedirection();
15HRESULT WIXAPI WcaRevertWow64FSRedirection();
16HRESULT WIXAPI WcaFinalizeWow64();
17
18#ifdef __cplusplus
19}
20#endif
diff --git a/src/libs/wcautil/WixToolset.WcaUtil/inc/wcawrapquery.h b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcawrapquery.h
new file mode 100644
index 00000000..e08f1c3f
--- /dev/null
+++ b/src/libs/wcautil/WixToolset.WcaUtil/inc/wcawrapquery.h
@@ -0,0 +1,130 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "wcautil.h"
6
7// Enumerations
8typedef enum eWrapQueryAction
9{
10 wqaTableBegin = 1,
11 wqaTableFinish,
12 wqaRowBegin,
13 wqaRowFinish
14} eWrapQueryAction;
15
16typedef enum eColumnDataType
17{
18 cdtString = 1,
19 cdtInt,
20 cdtStream,
21 cdtUnknown
22} eColumnDataType;
23
24typedef enum eFormatMaskColumn
25{
26 efmcColumn1 = 1,
27 efmcColumn2 = 1 << 1,
28 efmcColumn3 = 1 << 2,
29 efmcColumn4 = 1 << 3,
30 efmcColumn5 = 1 << 4,
31 efmcColumn6 = 1 << 5,
32 efmcColumn7 = 1 << 6,
33 efmcColumn8 = 1 << 7,
34 efmcColumn9 = 1 << 8,
35 efmcColumn10 = 1 << 9,
36 efmcColumn11 = 1 << 10,
37 efmcColumn12 = 1 << 11,
38 efmcColumn13 = 1 << 12,
39 efmcColumn14 = 1 << 13,
40 efmcColumn15 = 1 << 14,
41 efmcColumn16 = 1 << 15,
42 efmcColumn17 = 1 << 16,
43 efmcColumn18 = 1 << 17,
44 efmcColumn19 = 1 << 18,
45 efmcColumn20 = 1 << 19,
46 efmcColumn21 = 1 << 20,
47 efmcColumn22 = 1 << 21,
48 efmcColumn23 = 1 << 22,
49 efmcColumn24 = 1 << 23,
50 efmcColumn25 = 1 << 24,
51 efmcColumn26 = 1 << 25,
52 efmcColumn27 = 1 << 26,
53 efmcColumn28 = 1 << 27,
54 efmcColumn29 = 1 << 28,
55 efmcColumn30 = 1 << 29,
56 efmcColumn31 = 1 << 30,
57 efmcColumn32 = 1 << 31,
58} eFormatMaskColumn;
59
60// Keeps track of the query instance for the reading CA (deferred CA)
61typedef struct WCA_WRAPQUERY_STRUCT
62{
63 // These are used to size our dynamic arrays below
64 DWORD dwColumns, dwRows, dwNextIndex;
65
66 // Dynamic arrays of column schema information
67 eColumnDataType *pcdtColumnType;
68 LPWSTR *ppwzColumnNames;
69
70 // Dynamic array of raw record data
71 MSIHANDLE *phRecords;
72} *WCA_WRAPQUERY_HANDLE;
73
74// Wrap a query
75// Setting the pfFormatMask enables control over which fields will be formatted, and which will be left unchanged
76// Setting dwComponentColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two additional columns to the right side of the table
77// - ISInstalled and ISAction - which map to the ComponentState of the component (the component is found in the column specified)
78// Note that if a component is NULL, the component state columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately
79// Setting dwDirectoryColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two more additional columns to the right side of the table
80// - SourcePath and TargetPath - which map to the Directory's Source and Target Path (the directory is found in the column specified)
81// Note that if a directory is NULL, the directory source/target path columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately
82HRESULT WIXAPI WcaWrapQuery(
83 __in_z LPCWSTR pwzQuery,
84 __inout LPWSTR * ppwzCustomActionData,
85 __in_opt DWORD dwFormatMask,
86 __in_opt DWORD dwComponentColumn,
87 __in_opt DWORD dwDirectoryColumn
88 );
89// This wraps an empty table query into the custom action data - this is a way to indicate to the deferred custom action that a necessary table doesn't exist, or its query returned no results
90HRESULT WIXAPI WcaWrapEmptyQuery(
91 __inout LPWSTR * ppwzCustomActionData
92 );
93
94// Open a new unwrap query operation, with data from the ppwzCustomActionData string
95HRESULT WIXAPI WcaBeginUnwrapQuery(
96 __out WCA_WRAPQUERY_HANDLE * phWrapQuery,
97 __inout LPWSTR * ppwzCustomActionData
98 );
99
100// Get the number of records in a query being unwrapped
101DWORD WIXAPI WcaGetQueryRecords(
102 __in const WCA_WRAPQUERY_HANDLE hWrapQuery
103 );
104
105// This function resets a query back to its first row, so that the next fetch returns the first record
106void WIXAPI WcaFetchWrappedReset(
107 __in WCA_WRAPQUERY_HANDLE hWrapQuery
108 );
109// Fetch the next record in this query
110// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item.
111// so, don't use this function with PMSIHANDLE objects!
112HRESULT WIXAPI WcaFetchWrappedRecord(
113 __in WCA_WRAPQUERY_HANDLE hWrapQuery,
114 __out MSIHANDLE* phRec
115 );
116
117// Fetch the next record in the query where the string value in column dwComparisonColumn equals the value pwzExpectedValue
118// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item.
119// so, don't use this function with PMSIHANDLE objects!
120HRESULT WIXAPI WcaFetchWrappedRecordWhereString(
121 __in WCA_WRAPQUERY_HANDLE hWrapQuery,
122 __in DWORD dwComparisonColumn,
123 __in_z LPCWSTR pwzExpectedValue,
124 __out MSIHANDLE* phRec
125 );
126
127// Release a query ID (frees memory, and frees the ID for a new query)
128void WIXAPI WcaFinishUnwrapQuery(
129 __in_opt WCA_WRAPQUERY_HANDLE hWrapQuery
130 );