ReactOS 0.4.15-dev-8145-ga541a46
olepropframe.c
Go to the documentation of this file.
1/*
2 * Copyright 1999 Corel Corporation
3 * Sean Langley
4 * Copyright 2010 Geoffrey Hausheer
5 * Copyright 2010 Piotr Caban for CodeWeavers
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include <stdarg.h>
23
24#define COBJMACROS
25#define NONAMELESSUNION
26
27#include "windef.h"
28#include "winbase.h"
29#include "wingdi.h"
30#include "ole2.h"
31#include "olectl.h"
32#include "oledlg.h"
33#include "wine/debug.h"
34
36
37typedef struct {
42
44{
45 return CONTAINING_RECORD(iface, PropertyPageSite, IPropertyPageSite_iface);
46}
47
49{
51
52 switch(msg) {
53 case WM_INITDIALOG: {
54 RECT rect;
55
56 property_page = (IPropertyPage*)((LPPROPSHEETPAGEW)lparam)->lParam;
57
59 IPropertyPage_Activate(property_page, hwnd, &rect, TRUE);
60 IPropertyPage_Show(property_page, SW_SHOW);
61
62 SetWindowLongPtrW(hwnd, DWLP_USER, (LONG_PTR)property_page);
63 return FALSE;
64 }
65 case WM_DESTROY:
66 IPropertyPage_Show(property_page, SW_HIDE);
67 IPropertyPage_Deactivate(property_page);
68 return FALSE;
69 default:
70 return FALSE;
71 }
72}
73
75 REFIID riid, void** ppv)
76{
77 TRACE("(%p riid: %s)\n",iface, debugstr_guid(riid));
78
81 *ppv = iface;
82 else {
83 *ppv = NULL;
84 return E_NOINTERFACE;
85 }
86
87 IUnknown_AddRef((IUnknown*)*ppv);
88 return S_OK;
89}
90
92{
94 LONG ref = InterlockedIncrement(&this->ref);
95
96 TRACE("(%p) ref=%d\n", this, ref);
97 return ref;
98}
99
101{
103 LONG ref = InterlockedDecrement(&this->ref);
104
105 TRACE("(%p) ref=%d\n", this, ref);
106 if(!ref)
107 HeapFree(GetProcessHeap(), 0, this);
108 return ref;
109}
110
113{
114 TRACE("(%p, %x)\n", iface, dwFlags);
115 return S_OK;
116}
117
119 IPropertyPageSite *iface, LCID *pLocaleID)
120{
122
123 TRACE("(%p, %p)\n", iface, pLocaleID);
124 *pLocaleID = this->lcid;
125 return S_OK;
126}
127
129 IPropertyPageSite* iface, IUnknown** ppUnk)
130{
131 FIXME("(%p, %p)\n", iface, ppUnk);
132 return E_NOTIMPL;
133}
134
136 IPropertyPageSite* iface, MSG *pMsg)
137{
138 FIXME("(%p, %p)\n", iface, pMsg);
139 return E_NOTIMPL;
140}
141
142static IPropertyPageSiteVtbl PropertyPageSiteVtbl = {
150};
151
152/***********************************************************************
153 * OleCreatePropertyFrameIndirect (OLEAUT32.416)
154 */
156{
157 static const WCHAR comctlW[] = { 'c','o','m','c','t','l','3','2','.','d','l','l',0 };
158
159 PROPSHEETHEADERW property_sheet;
160 PROPSHEETPAGEW property_sheet_page;
161 struct {
162 DLGTEMPLATE template;
163 WORD menu;
164 WORD class;
165 WORD title;
166 } *dialogs;
167 IPropertyPage **property_page;
168 PropertyPageSite *property_page_site;
169 HRESULT res;
170 ULONG i;
171 HMODULE hcomctl;
172 HRSRC property_sheet_dialog_find = NULL;
173 HGLOBAL property_sheet_dialog_load = NULL;
174 WCHAR *property_sheet_dialog_data = NULL;
175 HDC hdc;
176 LOGFONTW font_desc;
177 HFONT hfont;
178 LONG font_width = 4, font_height = 8;
179
180 if(!lpParams)
181 return E_POINTER;
182
183 TRACE("(%d %p %d %d %s %d %p %d %p %d %d)\n", lpParams->cbStructSize,
184 lpParams->hWndOwner, lpParams->x, lpParams->y,
185 debugstr_w(lpParams->lpszCaption), lpParams->cObjects,
186 lpParams->lplpUnk, lpParams->cPages, lpParams->lpPages,
187 lpParams->lcid, lpParams->dispidInitialProperty);
188
189 if(!lpParams->lpPages)
190 return E_POINTER;
191
192 if(lpParams->cbStructSize != sizeof(OCPFIPARAMS)) {
193 WARN("incorrect structure size\n");
194 return E_INVALIDARG;
195 }
196
197 if(lpParams->dispidInitialProperty)
198 FIXME("dispidInitialProperty not yet implemented\n");
199
200 hdc = GetDC(NULL);
201 hcomctl = LoadLibraryW(comctlW);
202 if(hcomctl)
203 property_sheet_dialog_find = FindResourceW(hcomctl,
204 MAKEINTRESOURCEW(1006 /*IDD_PROPSHEET*/), (LPWSTR)RT_DIALOG);
205 if(property_sheet_dialog_find)
206 property_sheet_dialog_load = LoadResource(hcomctl, property_sheet_dialog_find);
207 if(property_sheet_dialog_load)
208 property_sheet_dialog_data = LockResource(property_sheet_dialog_load);
209
210 if(property_sheet_dialog_data) {
211 if(property_sheet_dialog_data[1] == 0xffff) {
212 ERR("Expected DLGTEMPLATE structure\n");
213 FreeLibrary(hcomctl);
214 return E_OUTOFMEMORY;
215 }
216
217 property_sheet_dialog_data += sizeof(DLGTEMPLATE)/sizeof(WCHAR);
218 /* Skip menu, class and title */
219 property_sheet_dialog_data += lstrlenW(property_sheet_dialog_data)+1;
220 property_sheet_dialog_data += lstrlenW(property_sheet_dialog_data)+1;
221 property_sheet_dialog_data += lstrlenW(property_sheet_dialog_data)+1;
222
223 memset(&font_desc, 0, sizeof(LOGFONTW));
224 /* Calculate logical height */
225 font_desc.lfHeight = -MulDiv(property_sheet_dialog_data[0],
227 font_desc.lfCharSet = DEFAULT_CHARSET;
228 memcpy(font_desc.lfFaceName, property_sheet_dialog_data+1,
229 sizeof(WCHAR)*(lstrlenW(property_sheet_dialog_data+1)+1));
230 hfont = CreateFontIndirectW(&font_desc);
231
232 if(hfont) {
234 font_width = GdiGetCharDimensions(hdc, NULL, &font_height);
236 }
237 }
238 if(hcomctl)
239 FreeLibrary(hcomctl);
241
242 memset(&property_sheet, 0, sizeof(property_sheet));
243 property_sheet.dwSize = sizeof(property_sheet);
244 if(lpParams->lpszCaption) {
245 property_sheet.dwFlags = PSH_PROPTITLE;
246 property_sheet.pszCaption = lpParams->lpszCaption;
247 }
248
249 property_sheet.u3.phpage = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
250 lpParams->cPages*sizeof(HPROPSHEETPAGE));
251 property_page = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
252 lpParams->cPages*sizeof(IPropertyPage*));
254 lpParams->cPages*sizeof(*dialogs));
255 if(!property_sheet.u3.phpage || !property_page || !dialogs) {
256 HeapFree(GetProcessHeap(), 0, property_sheet.u3.phpage);
257 HeapFree(GetProcessHeap(), 0, property_page);
258 HeapFree(GetProcessHeap(), 0, dialogs);
259 return E_OUTOFMEMORY;
260 }
261
262 memset(&property_sheet_page, 0, sizeof(PROPSHEETPAGEW));
263 property_sheet_page.dwSize = sizeof(PROPSHEETPAGEW);
264 property_sheet_page.dwFlags = PSP_DLGINDIRECT|PSP_USETITLE;
265 property_sheet_page.pfnDlgProc = property_sheet_proc;
266
267 for(i=0; i<lpParams->cPages; i++) {
268 PROPPAGEINFO page_info;
269
270 res = CoCreateInstance(&lpParams->lpPages[i], NULL, CLSCTX_INPROC_SERVER,
271 &IID_IPropertyPage, (void**)&property_page[i]);
272 if(FAILED(res))
273 continue;
274
275 property_page_site = HeapAlloc(GetProcessHeap(), 0, sizeof(PropertyPageSite));
276 if(!property_page_site)
277 continue;
278 property_page_site->IPropertyPageSite_iface.lpVtbl = &PropertyPageSiteVtbl;
279 property_page_site->ref = 1;
280 property_page_site->lcid = lpParams->lcid;
281
282 res = IPropertyPage_SetPageSite(property_page[i],
283 &property_page_site->IPropertyPageSite_iface);
284 IPropertyPageSite_Release(&property_page_site->IPropertyPageSite_iface);
285 if(FAILED(res))
286 continue;
287
288 res = IPropertyPage_SetObjects(property_page[i],
289 lpParams->cObjects, lpParams->lplpUnk);
290 if(FAILED(res))
291 WARN("SetObjects() failed, hr %#x.\n", res);
292
293 res = IPropertyPage_GetPageInfo(property_page[i], &page_info);
294 if(FAILED(res))
295 continue;
296
297 dialogs[i].template.cx = MulDiv(page_info.size.cx, 4, font_width);
298 dialogs[i].template.cy = MulDiv(page_info.size.cy, 8, font_height);
299
300 property_sheet_page.u.pResource = &dialogs[i].template;
301 property_sheet_page.lParam = (LPARAM)property_page[i];
302 property_sheet_page.pszTitle = page_info.pszTitle;
303
304 property_sheet.u3.phpage[property_sheet.nPages++] =
305 CreatePropertySheetPageW(&property_sheet_page);
306 }
307
308 PropertySheetW(&property_sheet);
309
310 for(i=0; i<lpParams->cPages; i++) {
311 if(property_page[i])
312 IPropertyPage_Release(property_page[i]);
313 }
314
315 HeapFree(GetProcessHeap(), 0, dialogs);
316 HeapFree(GetProcessHeap(), 0, property_page);
317 HeapFree(GetProcessHeap(), 0, property_sheet.u3.phpage);
318 return S_OK;
319}
320
321/***********************************************************************
322 * OleCreatePropertyFrame (OLEAUT32.417)
323 */
325 HWND hwndOwner, UINT x, UINT y, LPCOLESTR lpszCaption, ULONG cObjects,
326 LPUNKNOWN* ppUnk, ULONG cPages, LPCLSID pPageClsID, LCID lcid,
328{
329 OCPFIPARAMS ocpf;
330
331 ocpf.cbStructSize = sizeof(OCPFIPARAMS);
332 ocpf.hWndOwner = hwndOwner;
333 ocpf.x = x;
334 ocpf.y = y;
335 ocpf.lpszCaption = lpszCaption;
336 ocpf.cObjects = cObjects;
337 ocpf.lplpUnk = ppUnk;
338 ocpf.cPages = cPages;
339 ocpf.lpPages = pPageClsID;
340 ocpf.lcid = lcid;
341 ocpf.dispidInitialProperty = 0;
342
343 return OleCreatePropertyFrameIndirect(&ocpf);
344}
static HFONT hfont
@ lparam
Definition: SystemMenu.c:31
@ wparam
Definition: SystemMenu.c:30
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:114
#define WARN(fmt,...)
Definition: debug.h:115
#define ERR(fmt,...)
Definition: debug.h:113
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3083
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2913
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define FreeLibrary(x)
Definition: compat.h:748
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define LoadLibraryW(x)
Definition: compat.h:747
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrlenW
Definition: compat.h:750
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint res
Definition: glext.h:9613
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HDC hdc
Definition: main.c:9
static int font_height(HFONT hFont)
Definition: combo.c:612
static HDC
Definition: imagelist.c:92
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
unsigned int UINT
Definition: ndis.h:50
static LPUNKNOWN
Definition: ndr_ole.c:49
struct tagOCPFIPARAMS OCPFIPARAMS
const GUID IID_IPropertyPageSite
const GUID IID_IPropertyPage
static HRESULT WINAPI PropertyPageSite_TranslateAccelerator(IPropertyPageSite *iface, MSG *pMsg)
Definition: olepropframe.c:135
static HRESULT WINAPI PropertyPageSite_QueryInterface(IPropertyPageSite *iface, REFIID riid, void **ppv)
Definition: olepropframe.c:74
static INT_PTR CALLBACK property_sheet_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: olepropframe.c:48
static HRESULT WINAPI PropertyPageSite_GetPageContainer(IPropertyPageSite *iface, IUnknown **ppUnk)
Definition: olepropframe.c:128
static ULONG WINAPI PropertyPageSite_AddRef(IPropertyPageSite *iface)
Definition: olepropframe.c:91
static HRESULT WINAPI PropertyPageSite_OnStatusChange(IPropertyPageSite *iface, DWORD dwFlags)
Definition: olepropframe.c:111
static IPropertyPageSiteVtbl PropertyPageSiteVtbl
Definition: olepropframe.c:142
HRESULT WINAPI OleCreatePropertyFrame(HWND hwndOwner, UINT x, UINT y, LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN *ppUnk, ULONG cPages, LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved)
Definition: olepropframe.c:324
static ULONG WINAPI PropertyPageSite_Release(IPropertyPageSite *iface)
Definition: olepropframe.c:100
HRESULT WINAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams)
Definition: olepropframe.c:155
static HRESULT WINAPI PropertyPageSite_GetLocaleID(IPropertyPageSite *iface, LCID *pLocaleID)
Definition: olepropframe.c:118
static PropertyPageSite * impl_from_IPropertyPageSite(IPropertyPageSite *iface)
Definition: olepropframe.c:43
#define RT_DIALOG
Definition: pedump.c:367
long LONG
Definition: pedump.c:60
#define PSH_PROPTITLE
Definition: prsht.h:40
#define PSP_USETITLE
Definition: prsht.h:26
struct _PROPSHEETPAGEW PROPSHEETPAGEW
#define PSP_DLGINDIRECT
Definition: prsht.h:23
static char title[]
Definition: ps.c:92
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
DWORD LCID
Definition: nls.h:13
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
& rect
Definition: startmenu.cpp:1413
LONG lfHeight
Definition: dimm.idl:59
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
BYTE lfCharSet
Definition: dimm.idl:67
IPropertyPageSite IPropertyPageSite_iface
Definition: olepropframe.c:38
DWORD dwSize
Definition: prsht.h:293
DWORD dwFlags
Definition: prsht.h:294
HPROPSHEETPAGE * phpage
Definition: prsht.h:309
LPCWSTR pszCaption
Definition: prsht.h:301
DLGPROC pfnDlgProc
Definition: prsht.h:226
DWORD dwSize
Definition: prsht.h:214
DWORD dwFlags
Definition: prsht.h:215
LPARAM lParam
Definition: prsht.h:227
LPCDLGTEMPLATE pResource
Definition: prsht.h:219
LPCWSTR pszTitle
Definition: prsht.h:225
Definition: send.c:48
DISPID dispidInitialProperty
Definition: olectl.h:112
CLSID * lpPages
Definition: olectl.h:110
HWND hWndOwner
Definition: olectl.h:103
ULONG cbStructSize
Definition: olectl.h:102
LPCOLESTR lpszCaption
Definition: olectl.h:106
LPUNKNOWN * lplpUnk
Definition: olectl.h:108
ULONG cPages
Definition: olectl.h:109
ULONG cObjects
Definition: olectl.h:107
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT_PTR
Definition: typedefs.h:64
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
#define E_POINTER
Definition: winerror.h:2365
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *)
Definition: font.c:2145
#define LOGPIXELSY
Definition: wingdi.h:719
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define DEFAULT_CHARSET
Definition: wingdi.h:384
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define SW_HIDE
Definition: winuser.h:768
#define DWLP_USER
Definition: winuser.h:872
#define GetWindowLongPtrW
Definition: winuser.h:4829
#define WM_INITDIALOG
Definition: winuser.h:1739
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HDC WINAPI GetDC(_In_opt_ HWND)
#define SW_SHOW
Definition: winuser.h:775
#define WM_DESTROY
Definition: winuser.h:1609
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define SetWindowLongPtrW
Definition: winuser.h:5346
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184