ReactOS 0.4.17-dev-1133-gc25e4fd
mscfile.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Management Console
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Helper functions for MSXML3
5 * COPYRIGHT: Copyright 2026 Eric Kohl (eric.kohl@reactos.org)
6 */
7
8#include "precomp.h"
9
10#include <initguid.h>
11
12DEFINE_GUID(CLSID_DOMDocument30, 0xf5078f32, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);
13
14
16{
20}
21
23{
26}
27
28
29// Helper function to create a VT_BSTR variant from a null terminated string.
32{
33 HRESULT hr = S_OK;
34 BSTR bstr = SysAllocString(wszValue);
35 CHK_ALLOC(bstr);
36
37 V_VT(&Variant) = VT_BSTR;
38 V_BSTR(&Variant) = bstr;
39
40CleanUp:
41 return hr;
42}
43
44// Helper function to create a DOM instance.
47{
48 HRESULT hr = CoCreateInstance(CLSID_DOMDocument30,
49 NULL,
50 CLSCTX_INPROC_SERVER,
51 IID_IXMLDOMDocument,
52 (void**)&m_pDocument);
53 if (SUCCEEDED(hr))
54 {
55 m_pDocument->put_async(VARIANT_FALSE);
56 m_pDocument->put_validateOnParse(VARIANT_FALSE);
57 m_pDocument->put_resolveExternals(VARIANT_FALSE);
58 m_pDocument->put_preserveWhiteSpace(VARIANT_TRUE);
59 }
60 return hr;
61}
62
63// Helper that allocates the BSTR param for the caller.
66{
67 HRESULT hr = S_OK;
68 *ppElement = NULL;
69
70 BSTR bstrName = SysAllocString(wszName);
71 CHK_ALLOC(bstrName);
72 CHK_HR(m_pDocument->createElement(bstrName, ppElement));
73
74CleanUp:
75 SysFreeString(bstrName);
76 return hr;
77}
78
79// Helper function to append a child to a parent node.
82{
83 HRESULT hr = S_OK;
84 IXMLDOMNode *pChildOut = NULL;
85 if (pParent == NULL)
86 CHK_HR(m_pDocument->appendChild(pChild, &pChildOut));
87 else
88 CHK_HR(pParent->appendChild(pChild, &pChildOut));
89
90CleanUp:
91 SAFE_RELEASE(pChildOut);
92 return hr;
93}
94
95// Helper function to create and add a processing instruction to a document node.
98{
99 HRESULT hr = S_OK;
101
102 BSTR bstrTarget = SysAllocString(wszTarget);
103 BSTR bstrData = SysAllocString(wszData);
104 CHK_ALLOC(bstrTarget && bstrData);
105
106 CHK_HR(m_pDocument->createProcessingInstruction(bstrTarget, bstrData, &pPI));
108
109CleanUp:
110 SAFE_RELEASE(pPI);
111 SysFreeString(bstrTarget);
112 SysFreeString(bstrData);
113 return hr;
114}
115
116// Helper function to create and add a comment to a document node.
119{
120 HRESULT hr = S_OK;
121 IXMLDOMComment *pComment = NULL;
122
123 BSTR bstrComment = SysAllocString(wszComment);
124 CHK_ALLOC(bstrComment);
125
126 CHK_HR(m_pDocument->createComment(bstrComment, &pComment));
128
129CleanUp:
130 SAFE_RELEASE(pComment);
131 SysFreeString(bstrComment);
132 return hr;
133}
134
135// Helper function to create and add an attribute to a parent node.
138{
139 HRESULT hr = S_OK;
140 IXMLDOMAttribute *pAttribute = NULL;
141 IXMLDOMAttribute *pAttributeOut = NULL; // Out param that is not used
142
143 BSTR bstrName = NULL;
144 VARIANT varValue;
145 VariantInit(&varValue);
146
147 bstrName = SysAllocString(wszName);
148 CHK_ALLOC(bstrName);
149 CHK_HR(VariantFromString(wszValue, varValue));
150
151 CHK_HR(m_pDocument->createAttribute(bstrName, &pAttribute));
152 CHK_HR(pAttribute->put_value(varValue));
153 CHK_HR(pParent->setAttributeNode(pAttribute, &pAttributeOut));
154
155CleanUp:
156 SAFE_RELEASE(pAttribute);
157 SAFE_RELEASE(pAttributeOut);
158 SysFreeString(bstrName);
159 VariantClear(&varValue);
160 return hr;
161}
162
163// Helper function to create and append a text node to a parent node.
166{
167 HRESULT hr = S_OK;
169
170 BSTR bstrText = SysAllocString(wszText);
171 CHK_ALLOC(bstrText);
172
175
176CleanUp:
178 SysFreeString(bstrText);
179 return hr;
180}
181
182// Helper function to create and append a CDATA node to a parent node.
185{
186 HRESULT hr = S_OK;
187 IXMLDOMCDATASection *pCDATA = NULL;
188
189 BSTR bstrCDATA = SysAllocString(wszCDATA);
190 CHK_ALLOC(bstrCDATA);
191
192 CHK_HR(m_pDocument->createCDATASection(bstrCDATA, &pCDATA));
194
195CleanUp:
196 SAFE_RELEASE(pCDATA);
197 SysFreeString(bstrCDATA);
198 return hr;
199}
200
201// Helper function to create and append an element node to a parent node, and pass the newly created
202// element node to caller if it wants.
205{
206 HRESULT hr = S_OK;
207 IXMLDOMElement* pElement = NULL;
208
209 CHK_HR(CreateElement(wszName, &pElement));
211
212CleanUp:
213 if (ppElement)
214 *ppElement = pElement; // Caller is repsonsible to release this element.
215 else
216 SAFE_RELEASE(pElement); // Caller is not interested on this element, so release it.
217
218 return hr;
219}
220
223{
224 IXMLDOMElement *pWindowPlacement = NULL;
225 IXMLDOMElement *pPointElement = NULL;
226 IXMLDOMElement *pRectangleElement = NULL;
227 WINDOWPLACEMENT wndpl;
228 WCHAR szBuffer[32];
229 HRESULT hr = S_OK;
230
231 pWindow->GetWindowPlacement(&wndpl);
232
233 CHK_HR(CreateAndAddElementNode(L"WindowPlacement", pParentNode, &pWindowPlacement));
234 CHK_HR(CreateAndAddAttributeNode(L"ShowCommand", ::ShowCmdToString(wndpl.showCmd), pWindowPlacement));
235
236 CHK_HR(CreateAndAddElementNode(L"Point", pWindowPlacement, &pPointElement));
237 CHK_HR(CreateAndAddAttributeNode(L"Name", L"MinPosition", pPointElement));
238 _swprintf(szBuffer, L"%ld", wndpl.ptMinPosition.x);
239 CHK_HR(CreateAndAddAttributeNode(L"X", szBuffer, pPointElement));
240 _swprintf(szBuffer, L"%ld", wndpl.ptMinPosition.y);
241 CHK_HR(CreateAndAddAttributeNode(L"Y", szBuffer, pPointElement));
242 SAFE_RELEASE(pPointElement);
243
244 CHK_HR(CreateAndAddElementNode(L"Point", pWindowPlacement, &pPointElement));
245 CHK_HR(CreateAndAddAttributeNode(L"Name", L"MaxPosition", pPointElement));
246 _swprintf(szBuffer, L"%ld", wndpl.ptMaxPosition.x);
247 CHK_HR(CreateAndAddAttributeNode(L"X", szBuffer, pPointElement));
248 _swprintf(szBuffer, L"%ld", wndpl.ptMaxPosition.y);
249 CHK_HR(CreateAndAddAttributeNode(L"Y", szBuffer, pPointElement));
250 SAFE_RELEASE(pPointElement);
251
252 /* <Rectangle Name="NormalPosition" Top="0" Bottom="508" Left="0" Right="1186"/> */
253 CHK_HR(CreateAndAddElementNode(L"Rectangle", pWindowPlacement, &pRectangleElement));
254 CHK_HR(CreateAndAddAttributeNode(L"Name", L"NormalPosition", pRectangleElement));
255 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.top);
256 CHK_HR(CreateAndAddAttributeNode(L"Top", szBuffer, pRectangleElement));
257 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.bottom);
258 CHK_HR(CreateAndAddAttributeNode(L"Bottom", szBuffer, pRectangleElement));
259 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.left);
260 CHK_HR(CreateAndAddAttributeNode(L"Left", szBuffer, pRectangleElement));
261 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.right);
262 CHK_HR(CreateAndAddAttributeNode(L"Right", szBuffer, pRectangleElement));
263 SAFE_RELEASE(pRectangleElement);
264
265CleanUp:
266 SAFE_RELEASE(pWindowPlacement);
267
268 return hr;
269}
270
273{
274 IXMLDOMElement *pWindowPlacementElement = NULL;
275 IXMLDOMNodeList *pChildList = NULL;
276 IXMLDOMNode *pNextElement;
278 BSTR NodeName = NULL;
279 VARIANT ShowCommand;
280 VARIANT NameValue;
281 WINDOWPLACEMENT wndpl;
282 HRESULT hr = S_OK;
283
284 ZeroMemory(&wndpl, sizeof(wndpl));
285 wndpl.length = sizeof(wndpl);
286 wndpl.flags = 0;
287
288 hr = GetElement(pParentElement, (LPWSTR)L"WindowPlacement", &pWindowPlacementElement);
289 if (hr != S_OK)
290 goto done;
291
292 VariantInit(&ShowCommand);
293 hr = GetAttribute(pWindowPlacementElement, (LPWSTR)L"ShowCommand", &ShowCommand);
294 if (hr != S_OK)
295 goto done;
296
297 wndpl.showCmd = ShowCmdFromString(V_BSTR(&ShowCommand));
298
299 VariantClear(&ShowCommand);
300
301 hr = pWindowPlacementElement->get_childNodes(&pChildList);
302 if (FAILED(hr))
303 goto done;
304
305 for (;;)
306 {
307 hr = pChildList->nextNode(&pNextElement);
308 if (hr == S_FALSE)
309 {
310 hr = S_OK;
311 break;
312 }
313
314 hr = pNextElement->get_nodeType(&NodeType);
315 if (hr == S_OK)
316 {
317 if (NodeType == NODE_ELEMENT)
318 {
319 NodeName = NULL;
320 hr = pNextElement->get_baseName(&NodeName);
321 if (hr == S_OK)
322 {
323 VariantInit(&NameValue);
324
325 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"Name", &NameValue);
326 if (hr == S_OK)
327 {
328 if (_wcsicmp(NodeName, L"Point") == 0)
329 {
330 VARIANT PosX, PosY;
331 VariantInit(&PosX);
332 VariantInit(&PosY);
333 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"X", &PosX);
334 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"Y", &PosY);
335
336 if (_wcsicmp(V_BSTR(&NameValue), L"MinPosition") == 0)
337 {
338 wndpl.ptMinPosition.x = _wtol(V_BSTR(&PosX));
339 wndpl.ptMinPosition.y = _wtol(V_BSTR(&PosY));
340 }
341 else if (_wcsicmp(V_BSTR(&NameValue), L"MaxPosition") == 0)
342 {
343 wndpl.ptMaxPosition.x = _wtol(V_BSTR(&PosX));
344 wndpl.ptMaxPosition.y = _wtol(V_BSTR(&PosY));
345 }
346 VariantClear(&PosX);
347 VariantClear(&PosY);
348 }
349 else if (_wcsicmp(NodeName, L"Rectangle") == 0)
350 {
351 VARIANT PosTop, PosBottom, PosLeft, PosRight;
352 VariantInit(&PosTop);
353 VariantInit(&PosBottom);
354 VariantInit(&PosLeft);
355 VariantInit(&PosRight);
356 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"Top", &PosTop);
357 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"Bottom", &PosBottom);
358 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"Left", &PosLeft);
359 hr = GetAttribute((IXMLDOMElement *)pNextElement, (LPWSTR)L"Right", &PosRight);
360 if (_wcsicmp(V_BSTR(&NameValue), L"NormalPosition") == 0)
361 {
362 wndpl.rcNormalPosition.top = _wtol(V_BSTR(&PosTop));
363 wndpl.rcNormalPosition.bottom = _wtol(V_BSTR(&PosBottom));
364 wndpl.rcNormalPosition.left = _wtol(V_BSTR(&PosLeft));
365 wndpl.rcNormalPosition.right = _wtol(V_BSTR(&PosRight));
366 }
367 VariantClear(&PosTop);
368 VariantClear(&PosBottom);
369 VariantClear(&PosLeft);
370 VariantClear(&PosRight);
371 }
372
373 VariantClear(&NameValue);
374 }
375
376 SysFreeString(NodeName);
377 NodeName = NULL;
378 }
379 }
380 }
381
382 pNextElement->Release();
383 }
384
385 pWindow->SetWindowPlacement(&wndpl);
386
387done:
388 if (pChildList)
389 pChildList->Release();
390
391 if (pWindowPlacementElement)
392 pWindowPlacementElement->Release();
393
394 return hr;
395}
396
399{
400 IXMLDOMParseError *pXMLErr = NULL;
401 BSTR bstrErr = NULL;
402 VARIANT_BOOL varStatus;
403 HRESULT hr = S_OK;
404
405 hr = m_pDocument->load(m_varFileName, &varStatus);
406 if (varStatus != VARIANT_TRUE)
407 {
408 // Failed to load xml, get last parsing error
409 CHK_HR(m_pDocument->get_parseError(&pXMLErr));
410 CHK_HR(pXMLErr->get_reason(&bstrErr));
411 }
412
413CleanUp:
414 SAFE_RELEASE(pXMLErr);
415 SysFreeString(bstrErr);
416
417 return hr;
418}
419
422{
424}
425
428{
429 IXMLDOMElement *pRootElement = NULL;
430 BSTR rootName = NULL;
432 HRESULT hr = S_OK;
433
434 *ppRootElement = NULL;
435
437
438 hr = m_pDocument->get_documentElement(&pRootElement);
439 if (FAILED(hr))
440 goto done;
441
442 hr = pRootElement->get_baseName(&rootName);
443 if (FAILED(hr))
444 goto done;
445
446 if (_wcsicmp(rootName, L"MMC_ConsoleFile"))
447 {
448 hr = S_FALSE;
449 goto done;
450 }
451
452 hr = GetAttribute(pRootElement, (LPWSTR)L"ConsoleVersion", &version);
453 if (FAILED(hr))
454 goto done;
455
456 if (V_VT(&version) == VT_NULL)
457 {
458 hr = S_FALSE;
459 goto done;
460 }
461
462 if (wcscmp(V_BSTR(&version), L"2.0") &&
463 wcscmp(V_BSTR(&version), L"3.0"))
464 {
465 hr = S_FALSE;
466 goto done;
467 }
468
469 *ppRootElement = pRootElement;
470
471done:
473
474 if (rootName)
475 SysFreeString(rootName);
476
477 if ((hr != S_OK) && pRootElement != NULL)
478 pRootElement->Release();
479
480 return hr;
481}
482
485 IXMLDOMElement *pElement,
486 LPWSTR pszAttributeName,
487 VARIANT *pAttributeValue)
488{
489 BSTR bstrAttribute = NULL;
490 HRESULT hr = S_OK;
491
492 bstrAttribute = SysAllocString(pszAttributeName);
493 if (bstrAttribute == NULL)
494 {
496 goto done;
497 }
498
499 hr = pElement->getAttribute(bstrAttribute, pAttributeValue);
500
501done:
502 if (bstrAttribute)
503 SysFreeString(bstrAttribute);
504
505 return hr;
506}
507
510 IXMLDOMElement *pParentElement,
511 LPWSTR pszElementName,
512 IXMLDOMElement **ppElement)
513{
514 IXMLDOMNodeList *pChildList = NULL;
515 IXMLDOMNode *nextItem;
517 BSTR NodeName = NULL;
518 HRESULT hr = S_OK;
519
520 *ppElement = NULL;
521
522 hr = pParentElement->get_childNodes(&pChildList);
523 if (FAILED(hr))
524 goto done;
525
526 for (;;)
527 {
528 hr = pChildList->nextNode(&nextItem);
529 if (hr != S_OK)
530 break;
531
532 hr = nextItem->get_nodeType(&NodeType);
533 if (hr == S_OK)
534 {
535 if (NodeType == NODE_ELEMENT)
536 {
537 NodeName = NULL;
538 hr = nextItem->get_baseName(&NodeName);
539 if (hr == S_OK)
540 {
541 if (_wcsicmp(NodeName, pszElementName) == 0)
542 {
543 *ppElement = (IXMLDOMElement *)nextItem;
544 break;
545 }
546 SysFreeString(NodeName);
547 NodeName = NULL;
548 }
549 }
550 }
551
552 nextItem->Release();
553 }
554
555done:
556 if (NodeName)
557 SysFreeString(NodeName);
558
559 if (pChildList)
560 pChildList->Release();
561
562 return hr;
563}
564
565VOID
567{
568 if (pNode)
569 {
570 pNode->Release();
571 pNode = NULL;
572 }
573}
NodeType
Definition: Node.h:6
int ShowCmdFromString(LPWSTR pszString)
Definition: misc.cpp:176
BOOL GetWindowPlacement(WINDOWPLACEMENT *lpwndpl) const
Definition: atlwin.h:802
BOOL SetWindowPlacement(const WINDOWPLACEMENT *lpwndpl)
Definition: atlwin.h:1282
IXMLDOMDocument * m_pDocument
Definition: mscfile.h:21
HRESULT CreateAndInitDOM()
Definition: mscfile.cpp:46
VARIANT m_varFileName
Definition: mscfile.h:20
HRESULT CreateAndAddTextNode(PCWSTR wszText, IXMLDOMNode *pParent)
Definition: mscfile.cpp:165
HRESULT GetElement(IXMLDOMElement *pParentElement, LPWSTR pszElementName, IXMLDOMElement **ppElement)
Definition: mscfile.cpp:509
LPWSTR ShowCmdToString(int nShowCmd)
HRESULT CreateElement(PCWSTR wszName, IXMLDOMElement **ppElement)
Definition: mscfile.cpp:65
HRESULT ParseWindowPlacement(CWindow *pWindow, IXMLDOMElement *pParentElement)
Definition: mscfile.cpp:272
~MscFile()
Definition: mscfile.cpp:22
HRESULT VariantFromString(PCWSTR wszValue, VARIANT &Variant)
Definition: mscfile.cpp:31
HRESULT LoadDOM()
Definition: mscfile.cpp:398
HRESULT CreateAndAddCommentNode(PCWSTR wszComment)
Definition: mscfile.cpp:118
HRESULT CreateAndAddCDATANode(PCWSTR wszCDATA, IXMLDOMNode *pParent)
Definition: mscfile.cpp:184
HRESULT SaveWindowPlacement(CWindow *pWindow, IXMLDOMElement *pParentNode)
Definition: mscfile.cpp:222
HRESULT GetAttribute(IXMLDOMElement *pElement, LPWSTR pszAttributeName, VARIANT *pAttributeValue)
Definition: mscfile.cpp:484
HRESULT SaveDOM()
Definition: mscfile.cpp:421
VOID ReleaseNode(IXMLDOMNode *pNode)
Definition: mscfile.cpp:566
HRESULT CreateAndAddAttributeNode(PCWSTR wszName, PCWSTR wszValue, IXMLDOMElement *pParent)
Definition: mscfile.cpp:137
HRESULT AppendChildToParent(IXMLDOMNode *pChild, IXMLDOMNode *pParent=NULL)
Definition: mscfile.cpp:81
HRESULT CheckMscFile(IXMLDOMElement **ppRootElement)
Definition: mscfile.cpp:427
HRESULT CreateAndAddPINode(PCWSTR wszTarget, PCWSTR wszData)
Definition: mscfile.cpp:97
MscFile(PCWSTR pszFileName)
Definition: mscfile.cpp:15
HRESULT CreateAndAddElementNode(PCWSTR wszName, IXMLDOMNode *pParent, IXMLDOMElement **ppElement=NULL)
Definition: mscfile.cpp:204
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
@ VT_NULL
Definition: compat.h:2296
static const WCHAR version[]
Definition: asmname.c:66
_ACRTIMP __msvcrt_long __cdecl _wtol(const wchar_t *)
Definition: wcs.c:2803
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
#define L(x)
Definition: resources.c:13
#define NodeType(P)
Definition: nodetype.h:51
FxObject * pParent
Definition: fxdpcapi.cpp:86
ULONG Release()
HRESULT createCDATASection([in] BSTR p, [retval, out] IXMLDOMCDATASection **cdata)
HRESULT createComment([in] BSTR p, [retval, out] IXMLDOMComment **comment)
HRESULT save([in] VARIANT var1)
HRESULT load([in] VARIANT var1, [retval, out] VARIANT_BOOL *pbool)
HRESULT createProcessingInstruction([in] BSTR target, [in] BSTR data, [retval, out] IXMLDOMProcessingInstruction **pi)
HRESULT createElement([in] BSTR p, [retval, out] IXMLDOMElement **domElement)
HRESULT createTextNode([in] BSTR p, [retval, out] IXMLDOMText **text)
HRESULT createAttribute([in] BSTR p, [retval, out] IXMLDOMAttribute **attribute)
HRESULT getAttribute([in] BSTR p, [retval, out] VARIANT *var)
HRESULT nextNode([retval, out] IXMLDOMNode **outNode)
HRESULT appendChild([in] IXMLDOMNode *newNode, [retval, out] IXMLDOMNode **outNewNode)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define ZeroMemory
Definition: minwinbase.h:31
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
#define SAFE_RELEASE(p)
Definition: mscfile.h:15
#define CHK_ALLOC(p)
Definition: mscfile.h:12
#define CHK_HR(stmt)
Definition: mscfile.h:9
enum tagDOMNodeType DOMNodeType
@ NODE_ELEMENT
Definition: msxml6.idl:113
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
short WCHAR
Definition: pedump.c:58
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
POINT ptMaxPosition
Definition: winuser.h:3402
RECT rcNormalPosition
Definition: winuser.h:3403
POINT ptMinPosition
Definition: winuser.h:3401
LPCSTR pText
Definition: txtscale.cpp:79
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
#define S_FALSE
Definition: winerror.h:3451