ReactOS 0.4.15-dev-5865-g640e228
propsheet_general.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/propsheet_general.c
5 * PURPOSE: Property dialog box message handler
6 * COPYRIGHT: Copyright 2006-2009 Ged Murphy <gedmurphy@reactos.org>
7 *
8 */
9
10#include "precomp.h"
11
12
13typedef struct _PAGEDATA
14{
21
22
23static VOID
25 HWND hwndDlg)
26{
27 HWND hButton;
28 LPQUERY_SERVICE_CONFIG lpServiceConfig;
30 UINT i;
31
34
35 for (i = IDC_START; i <= IDC_RESUME; i++)
36 {
37 hButton = GetDlgItem(hwndDlg, i);
38 EnableWindow (hButton, FALSE);
39 }
40
41 lpServiceConfig = GetServiceConfig(dlgInfo->pService->lpServiceName);
42 if (State == SERVICE_STOPPED &&
43 lpServiceConfig && lpServiceConfig->dwStartType != SERVICE_DISABLED)
44 {
45 hButton = GetDlgItem(hwndDlg, IDC_START);
46 EnableWindow (hButton, TRUE);
47 }
48 else if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
49 {
50 hButton = GetDlgItem(hwndDlg, IDC_STOP);
51 EnableWindow (hButton, TRUE);
52 }
54 {
55 hButton = GetDlgItem(hwndDlg, IDC_PAUSE);
56 EnableWindow (hButton, TRUE);
57 }
58
59 hButton = GetDlgItem(hwndDlg, IDC_START_PARAM);
60 EnableWindow(hButton, (State == SERVICE_STOPPED && lpServiceConfig && lpServiceConfig->dwStartType != SERVICE_DISABLED));
61
62 if (lpServiceConfig)
63 HeapFree(GetProcessHeap(), 0, lpServiceConfig);
64
65 /* set the main toolbar */
67}
68
69static VOID
71 HWND hwndDlg)
72{
73 LPWSTR lpStatus;
74 UINT id;
75
77 {
79 }
80 else
81 {
83 }
84
85 if (AllocAndLoadString(&lpStatus,
87 id))
88 {
89 SendDlgItemMessageW(hwndDlg,
92 0,
93 (LPARAM)lpStatus);
94 LocalFree(lpStatus);
95 }
96}
97
98/*
99 * Fills the 'startup type' combo box with possible
100 * values and sets it to value of the selected item
101 */
102static VOID
103SetStartupType(LPWSTR lpServiceName,
104 HWND hwndDlg)
105{
106 HWND hList;
107 LPQUERY_SERVICE_CONFIG pServiceConfig;
108 LPWSTR lpBuf;
109 DWORD StartUp = 0;
110 UINT i;
111
112 hList = GetDlgItem(hwndDlg, IDC_START_TYPE);
113
114 for (i = IDS_SERVICES_AUTO; i <= IDS_SERVICES_DIS; i++)
115 {
116 if (AllocAndLoadString(&lpBuf,
117 hInstance,
118 i))
119 {
122 0,
123 (LPARAM)lpBuf);
124 LocalFree(lpBuf);
125 }
126 }
127
128 pServiceConfig = GetServiceConfig(lpServiceName);
129
130 if (pServiceConfig)
131 {
132 switch (pServiceConfig->dwStartType)
133 {
134 case SERVICE_AUTO_START: StartUp = 0; break;
135 case SERVICE_DEMAND_START: StartUp = 1; break;
136 case SERVICE_DISABLED: StartUp = 2; break;
137 }
138
141 StartUp,
142 0);
143
145 0,
146 pServiceConfig);
147 }
148}
149
150/*
151 * Populates the General Properties dialog with
152 * the relevant service information
153 */
154static VOID
156 HWND hwndDlg)
157{
158 LPQUERY_SERVICE_CONFIG pServiceConfig;
159 LPWSTR lpDescription;
160
161 /* set the service name */
162 SendDlgItemMessageW(hwndDlg,
165 0,
166 (LPARAM)dlgInfo->pService->lpServiceName);
167
168 /* set the display name */
169 SendDlgItemMessageW(hwndDlg,
172 0,
173 (LPARAM)dlgInfo->pService->lpDisplayName);
174
175 /* set the description */
176 if ((lpDescription = GetServiceDescription(dlgInfo->pService->lpServiceName)))
177 {
178 SendDlgItemMessageW(hwndDlg,
181 0,
182 (LPARAM)lpDescription);
183
185 0,
186 lpDescription);
187 }
188
189 pServiceConfig = GetServiceConfig(dlgInfo->pService->lpServiceName);
190 if (pServiceConfig)
191 {
192 SendDlgItemMessageW(hwndDlg,
195 0,
196 (LPARAM)pServiceConfig->lpBinaryPathName);
198 0,
199 pServiceConfig);
200 }
201
202
203 /* set startup type */
204 SetStartupType(dlgInfo->pService->lpServiceName, hwndDlg);
205
206 SetServiceStatusText(dlgInfo,
207 hwndDlg);
208
209 if (dlgInfo->Info->bIsUserAnAdmin)
210 {
212 }
213}
214
215VOID
217 HWND hwndDlg)
218{
219 LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
220 PWSTR pDisplayName = NULL;
221 PWSTR pDescription;
222 INT nLength;
223 DWORD StartUp;
224
225 pServiceConfig = HeapAlloc(ProcessHeap,
227 sizeof(*pServiceConfig));
228 if (pServiceConfig)
229 {
230 pServiceConfig->dwServiceType = SERVICE_NO_CHANGE;
231 pServiceConfig->dwErrorControl = SERVICE_NO_CHANGE;
232 pServiceConfig->dwStartType = SERVICE_NO_CHANGE;
233
234 if (pPageData->bStartTypeChanged)
235 {
236 StartUp = SendDlgItemMessageW(hwndDlg, IDC_START_TYPE, CB_GETCURSEL, 0, 0);
237 switch (StartUp)
238 {
239 case 0:
240 pServiceConfig->dwStartType = SERVICE_AUTO_START;
241 break;
242
243 case 1:
244 pServiceConfig->dwStartType = SERVICE_DEMAND_START;
245 break;
246 case 2:
247 pServiceConfig->dwStartType = SERVICE_DISABLED;
248 break;
249 }
250 }
251
252 if (pPageData->bBinaryPathChanged)
253 {
255 pServiceConfig->lpBinaryPathName = HeapAlloc(ProcessHeap,
257 (nLength + 1) * sizeof(WCHAR));
258 if (pServiceConfig->lpBinaryPathName != NULL)
260 }
261
262 if (pPageData->bDisplayNameChanged)
263 {
265 pDisplayName = HeapAlloc(ProcessHeap,
267 (nLength + 1) * sizeof(WCHAR));
268 if (pDisplayName != NULL)
269 {
270 SendDlgItemMessageW(hwndDlg, IDC_DISP_NAME, WM_GETTEXT, nLength + 1, (LPARAM)pDisplayName);
271
272 if (pPageData->dlgInfo->pService->lpDisplayName)
274
275 pPageData->dlgInfo->pService->lpDisplayName = pDisplayName;
276 pServiceConfig->lpDisplayName = pDisplayName;
277 }
278 }
279
280 if (SetServiceConfig(pServiceConfig,
281 pPageData->dlgInfo->pService->lpServiceName,
282 NULL))
283 {
284 if (pPageData->bDisplayNameChanged)
285 ChangeListViewText(pPageData->dlgInfo->Info,
286 pPageData->dlgInfo->pService,
287 LVNAME);
288
289 if (pPageData->bStartTypeChanged)
290 ChangeListViewText(pPageData->dlgInfo->Info,
291 pPageData->dlgInfo->pService,
292 LVSTARTUP);
293 }
294
295 if (pServiceConfig->lpBinaryPathName != NULL)
296 HeapFree(ProcessHeap, 0, pServiceConfig->lpBinaryPathName);
297
298 HeapFree(ProcessHeap, 0, pServiceConfig);
299 }
300
301 if (pPageData->bDescriptionChanged)
302 {
304 pDescription = HeapAlloc(ProcessHeap, HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));
305 if (pDescription != NULL)
306 {
307 SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_GETTEXT, nLength + 1, (LPARAM)pDescription);
308
310 pDescription))
311 {
312 ChangeListViewText(pPageData->dlgInfo->Info,
313 pPageData->dlgInfo->pService,
314 LVDESC);
315 }
316
317 HeapFree(ProcessHeap, 0, pDescription);
318 }
319 }
320}
321
322/*
323 * General Property dialog callback.
324 * Controls messages to the General dialog
325 */
328 UINT uMsg,
331{
332 PPAGEDATA pPageData;
333
334 /* Get the window context */
335 pPageData = (PPAGEDATA)GetWindowLongPtr(hwndDlg,
337 if (pPageData == NULL && uMsg != WM_INITDIALOG)
338 {
339 return FALSE;
340 }
341
342 switch (uMsg)
343 {
344 case WM_INITDIALOG:
345 pPageData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PAGEDATA));
346 if (pPageData != NULL)
347 {
348 SetWindowLongPtr(hwndDlg,
350 (LONG_PTR)pPageData);
351
352 pPageData->dlgInfo = (PSERVICEPROPSHEET)(((LPPROPSHEETPAGE)lParam)->lParam);
353 if (pPageData->dlgInfo != NULL)
354 {
355 InitGeneralPage(pPageData->dlgInfo, hwndDlg);
356 SetButtonStates(pPageData->dlgInfo, hwndDlg);
357 }
358 }
359 break;
360
361 case WM_DESTROY:
362 HeapFree(GetProcessHeap(), 0, pPageData);
363 break;
364
365 case WM_COMMAND:
366 switch(LOWORD(wParam))
367 {
368 case IDC_START_TYPE:
370 {
371 pPageData->bStartTypeChanged = TRUE;
372 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
373 }
374 break;
375
376 case IDC_DISP_NAME:
377 if (HIWORD(wParam) == EN_CHANGE)
378 {
379 pPageData->bDisplayNameChanged = TRUE;
380 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
381 }
382 break;
383
384 case IDC_DESCRIPTION:
385 if (HIWORD(wParam) == EN_CHANGE)
386 {
387 pPageData->bDescriptionChanged = TRUE;
388 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
389 }
390 break;
391
392 case IDC_EXEPATH:
393 if (HIWORD(wParam) == EN_CHANGE)
394 {
395 pPageData->bBinaryPathChanged = TRUE;
396 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
397 }
398 break;
399
400 case IDC_START:
401 {
402 WCHAR szStartParams[256];
403 LPWSTR lpStartParams = NULL;
404
405 if (GetDlgItemText(hwndDlg, IDC_START_PARAM, szStartParams, 256) > 0)
406 lpStartParams = szStartParams;
407
409
410 RunActionWithProgress(hwndDlg,
411 pPageData->dlgInfo->pService->lpServiceName,
412 pPageData->dlgInfo->pService->lpDisplayName,
414 lpStartParams);
415
417 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
418 SetButtonStates(pPageData->dlgInfo, hwndDlg);
419 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
420 break;
421 }
422
423 case IDC_STOP:
424 RunActionWithProgress(hwndDlg,
425 pPageData->dlgInfo->pService->lpServiceName,
426 pPageData->dlgInfo->pService->lpDisplayName,
428 NULL);
429
431 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
432 SetButtonStates(pPageData->dlgInfo, hwndDlg);
433 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
434 break;
435
436 case IDC_PAUSE:
437 RunActionWithProgress(hwndDlg,
438 pPageData->dlgInfo->pService->lpServiceName,
439 pPageData->dlgInfo->pService->lpDisplayName,
441 NULL);
442
444 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
445 SetButtonStates(pPageData->dlgInfo, hwndDlg);
446 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
447 break;
448
449 case IDC_RESUME:
450 RunActionWithProgress(hwndDlg,
451 pPageData->dlgInfo->pService->lpServiceName,
452 pPageData->dlgInfo->pService->lpDisplayName,
454 NULL);
455
457 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
458 SetButtonStates(pPageData->dlgInfo, hwndDlg);
459 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
460 break;
461
462 case IDC_EDIT:
467 break;
468 }
469 break;
470
471 case WM_NOTIFY:
472 switch (((LPNMHDR)lParam)->code)
473 {
474 case PSN_APPLY:
475 if (pPageData->bDisplayNameChanged ||
476 pPageData->bDescriptionChanged ||
477 pPageData->bBinaryPathChanged ||
478 pPageData->bStartTypeChanged)
479 {
480 SaveDlgInfo(pPageData, hwndDlg);
481 SetButtonStates(pPageData->dlgInfo, hwndDlg);
482 pPageData->bDisplayNameChanged = FALSE;
483 pPageData->bDescriptionChanged = FALSE;
484 pPageData->bBinaryPathChanged = FALSE;
485 pPageData->bStartTypeChanged = FALSE;
486 }
487 break;
488 }
489 break;
490 }
491
492 return FALSE;
493}
INT AllocAndLoadString(OUT LPTSTR *lpTarget, IN HINSTANCE hInst, IN UINT uID)
Definition: misc.c:59
#define IDC_PAUSE
Definition: resource.h:75
#define IDC_STOP
Definition: resource.h:69
VOID ChangeListViewText(PMAIN_WND_INFO Info, ENUM_SERVICE_STATUS_PROCESS *pService, UINT Column)
Definition: listview.c:105
VOID SetMenuAndButtonStates(PMAIN_WND_INFO Info)
Definition: mainwnd.c:152
LPQUERY_SERVICE_CONFIG GetServiceConfig(LPWSTR lpServiceName)
Definition: query.c:29
#define LVDESC
Definition: precomp.h:30
BOOL SetServiceConfig(LPQUERY_SERVICE_CONFIG pServiceConfig, LPWSTR lpServiceName, LPWSTR lpPassword)
Definition: query.c:82
HANDLE ProcessHeap
Definition: servman.c:15
#define ACTION_START
Definition: precomp.h:39
BOOL SetServiceDescription(LPWSTR lpServiceName, LPWSTR lpDescription)
Definition: query.c:210
BOOL RunActionWithProgress(HWND hParent, LPWSTR ServiceName, LPWSTR DisplayName, UINT Action, PVOID Param)
Definition: progress.c:372
#define ACTION_PAUSE
Definition: precomp.h:41
BOOL UpdateServiceStatus(ENUM_SERVICE_STATUS_PROCESS *pService)
Definition: query.c:373
#define LVSTATUS
Definition: precomp.h:31
struct _SERVICEPROPSHEET * PSERVICEPROPSHEET
#define LVSTARTUP
Definition: precomp.h:32
LPWSTR GetServiceDescription(LPWSTR lpServiceName)
Definition: query.c:135
#define ACTION_STOP
Definition: precomp.h:40
#define ACTION_RESUME
Definition: precomp.h:42
#define LVNAME
Definition: precomp.h:29
#define IDC_DESCRIPTION
Definition: resource.h:129
#define IDC_SERV_NAME
Definition: resource.h:127
#define IDC_SERV_STATUS
Definition: resource.h:132
#define IDS_SERVICES_AUTO
Definition: resource.h:59
#define IDC_START
Definition: resource.h:135
#define IDC_EXEPATH
Definition: resource.h:130
#define IDC_EDIT
Definition: resource.h:134
#define IDC_RESUME
Definition: resource.h:138
#define IDS_SERVICES_STOPPED
Definition: resource.h:58
#define IDC_START_TYPE
Definition: resource.h:131
#define IDS_SERVICES_STARTED
Definition: resource.h:57
#define IDC_START_PARAM
Definition: resource.h:133
#define IDC_DISP_NAME
Definition: resource.h:128
#define IDS_SERVICES_DIS
Definition: resource.h:61
HINSTANCE hInstance
Definition: charmap.c:19
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint id
Definition: glext.h:5910
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
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
HWND hList
Definition: livecd.c:10
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82
static VOID InitGeneralPage(PSERVICEPROPSHEET dlgInfo, HWND hwndDlg)
struct _PAGEDATA PAGEDATA
INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
static VOID SetButtonStates(PSERVICEPROPSHEET dlgInfo, HWND hwndDlg)
struct _PAGEDATA * PPAGEDATA
static VOID SetStartupType(LPWSTR lpServiceName, HWND hwndDlg)
VOID SaveDlgInfo(PPAGEDATA pPageData, HWND hwndDlg)
static VOID SetServiceStatusText(PSERVICEPROPSHEET dlgInfo, HWND hwndDlg)
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
#define PSN_APPLY
Definition: prsht.h:117
#define LPPROPSHEETPAGE
Definition: prsht.h:390
#define WM_NOTIFY
Definition: richedit.h:61
SERVICE_STATUS_PROCESS ServiceStatusProcess
Definition: winsvc.h:137
BOOL bIsUserAnAdmin
Definition: precomp.h:68
PSERVICEPROPSHEET dlgInfo
BOOL bDescriptionChanged
BOOL bDisplayNameChanged
BOOL bStartTypeChanged
BOOL bBinaryPathChanged
ENUM_SERVICE_STATUS_PROCESS * pService
Definition: precomp.h:131
PMAIN_WND_INFO Info
Definition: precomp.h:130
Definition: inflate.c:139
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
#define GWLP_USERDATA
Definition: treelist.c:63
uint16_t * PWSTR
Definition: typedefs.h:56
int32_t INT_PTR
Definition: typedefs.h:64
int32_t INT
Definition: typedefs.h:58
#define HIWORD(l)
Definition: typedefs.h:247
_In_ DWORD nLength
Definition: wincon.h:473
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define SERVICE_STOPPED
Definition: winsvc.h:21
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
#define SERVICE_NO_CHANGE
Definition: winsvc.h:20
#define SERVICE_RUNNING
Definition: winsvc.h:24
#define SERVICE_ACCEPT_PAUSE_CONTINUE
Definition: winsvc.h:29
#define EM_SETREADONLY
Definition: winuser.h:2005
#define WM_GETTEXTLENGTH
Definition: winuser.h:1609
#define GetDlgItemText
Definition: winuser.h:5775
#define WM_COMMAND
Definition: winuser.h:1730
#define CB_SETCURSEL
Definition: winuser.h:1951
#define WM_GETTEXT
Definition: winuser.h:1608
#define WM_INITDIALOG
Definition: winuser.h:1729
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define CBN_SELCHANGE
Definition: winuser.h:1969
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_SETTEXT
Definition: winuser.h:1607
#define CB_ADDSTRING
Definition: winuser.h:1926
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HWND WINAPI GetParent(_In_ HWND)
#define WM_DESTROY
Definition: winuser.h:1599
#define CB_GETCURSEL
Definition: winuser.h:1933
#define SendDlgItemMessage
Definition: winuser.h:5832
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define EN_CHANGE
Definition: winuser.h:2012
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define SERVICE_DEMAND_START
Definition: cmtypes.h:978
#define SERVICE_DISABLED
Definition: cmtypes.h:979
#define SERVICE_AUTO_START
Definition: cmtypes.h:977
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184