ReactOS 0.4.15-dev-7906-g1b85a5f
progress.c
Go to the documentation of this file.
1/* Unit tests for the progress bar control.
2 *
3 * Copyright 2005 Michael Kaufmann
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include <stdarg.h>
21
22#include "windef.h"
23#include "winbase.h"
24#include "wingdi.h"
25#include "winuser.h"
26#include "commctrl.h"
27
28#include "wine/test.h"
29
30#include "v6util.h"
31
33static const char progressTestClass[] = "ProgressBarTestClass";
34static BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*);
35
37{
39 0, 0, 100, 20, NULL, NULL, GetModuleHandleA(NULL), 0);
40}
41
42/* try to make sure pending X events have been processed before continuing */
43static void flush_events(void)
44{
45 MSG msg;
46 int diff = 100;
47 DWORD time = GetTickCount() + diff;
48
49 while (diff > 0)
50 {
51 if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min(10,diff), QS_ALLINPUT ) == WAIT_TIMEOUT) break;
52 while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
53 diff = time - GetTickCount();
54 }
55}
56
58{
59 switch(msg) {
60
61 case WM_DESTROY:
63 break;
64
65 default:
67 }
68
69 return 0L;
70}
71
73static BOOL erased;
75
77{
78 if (msg == WM_PAINT)
79 {
81 }
82 else if (msg == WM_ERASEBKGND)
83 {
84 erased = TRUE;
85 }
87}
88
89
91{
93 ok(!GetUpdateRect(hWnd, NULL, FALSE), "GetUpdateRect must return zero after UpdateWindow\n");
94}
95
96
97static void init(void)
98{
99 WNDCLASSA wc;
100 RECT rect;
101 BOOL ret;
102
104 wc.cbClsExtra = 0;
105 wc.cbWndExtra = 0;
107 wc.hIcon = NULL;
110 wc.lpszMenuName = NULL;
113 RegisterClassA(&wc);
114
115 SetRect(&rect, 0, 0, 400, 20);
117 ok(ret, "got %d\n", ret);
118
120 CW_USEDEFAULT, CW_USEDEFAULT, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, GetModuleHandleA(NULL), 0);
121 ok(hProgressParentWnd != NULL, "failed to create parent wnd\n");
122
123}
124
125static void cleanup(void)
126{
127 MSG msg;
128
130 while (GetMessageA(&msg,0,0,0)) {
133 }
134
136}
137
138
139/*
140 * Tests if a progress bar repaints itself immediately when it receives
141 * some specific messages.
142 */
143static void test_redraw(void)
144{
145 RECT client_rect, rect;
146 HWND hProgressWnd;
147 LRESULT ret;
148
150 hProgressWnd = CreateWindowExA(0, PROGRESS_CLASSA, "", WS_CHILD | WS_VISIBLE,
151 0, 0, rect.right, rect.bottom, hProgressParentWnd, NULL, GetModuleHandleA(NULL), 0);
152 ok(hProgressWnd != NULL, "Failed to create progress bar.\n");
154
156 ok(GetUpdateRect(hProgressParentWnd, NULL, FALSE), "GetUpdateRect: There should be a region that needs to be updated\n");
157 flush_events();
159
160 SendMessageA(hProgressWnd, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
161 SendMessageA(hProgressWnd, PBM_SETPOS, 10, 0);
162 SendMessageA(hProgressWnd, PBM_SETSTEP, 20, 0);
163 update_window(hProgressWnd);
164
165 /* PBM_SETPOS */
166 ok(SendMessageA(hProgressWnd, PBM_SETPOS, 50, 0) == 10, "PBM_SETPOS must return the previous position\n");
167 ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_SETPOS: The progress bar should be redrawn immediately\n");
168
169 /* PBM_DELTAPOS */
170 ok(SendMessageA(hProgressWnd, PBM_DELTAPOS, 15, 0) == 50, "PBM_DELTAPOS must return the previous position\n");
171 ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_DELTAPOS: The progress bar should be redrawn immediately\n");
172
173 /* PBM_SETPOS */
174 ok(SendMessageA(hProgressWnd, PBM_SETPOS, 80, 0) == 65, "PBM_SETPOS must return the previous position\n");
175 ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_SETPOS: The progress bar should be redrawn immediately\n");
176
177 /* PBM_STEPIT */
178 ok(SendMessageA(hProgressWnd, PBM_STEPIT, 0, 0) == 80, "PBM_STEPIT must return the previous position\n");
179 ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_STEPIT: The progress bar should be redrawn immediately\n");
180 ret = SendMessageA(hProgressWnd, PBM_GETPOS, 0, 0);
181 if (ret == 0)
182 win_skip("PBM_GETPOS needs comctl32 > 4.70\n");
183 else
184 ok(ret == 100, "PBM_GETPOS returned a wrong position : %d\n", (UINT)ret);
185
186 /* PBM_SETRANGE and PBM_SETRANGE32:
187 Usually the progress bar doesn't repaint itself immediately. If the
188 position is not in the new range, it does.
189 Don't test this, it may change in future Windows versions. */
190
191 SendMessageA(hProgressWnd, PBM_SETPOS, 0, 0);
192 update_window(hProgressWnd);
193
194 /* increase to 10 - no background erase required */
195 erased = FALSE;
197 SendMessageA(hProgressWnd, PBM_SETPOS, 10, 0);
198 GetClientRect(hProgressWnd, &client_rect);
199 ok(EqualRect(&last_paint_rect, &client_rect), "last_paint_rect was %s instead of %s\n",
201 update_window(hProgressWnd);
202 ok(!erased, "Progress bar shouldn't have erased the background\n");
203
204 /* decrease to 0 - background erase will be required */
205 erased = FALSE;
207 SendMessageA(hProgressWnd, PBM_SETPOS, 0, 0);
208 GetClientRect(hProgressWnd, &client_rect);
209 ok(EqualRect(&last_paint_rect, &client_rect), "last_paint_rect was %s instead of %s\n",
211 update_window(hProgressWnd);
212 ok(erased, "Progress bar should have erased the background\n");
213
214 DestroyWindow(hProgressWnd);
215}
216
217static void test_setcolors(void)
218{
220 COLORREF clr;
221
223
225 ok(clr == CLR_DEFAULT, "got %x\n", clr);
226
227 clr = SendMessageA(progress, PBM_SETBARCOLOR, 0, RGB(0, 255, 0));
228 ok(clr == 0, "got %x\n", clr);
229
231 ok(clr == RGB(0, 255, 0), "got %x\n", clr);
232
234 ok(clr == CLR_DEFAULT, "got %x\n", clr);
235
236 clr = SendMessageA(progress, PBM_SETBKCOLOR, 0, RGB(255, 0, 0));
237 ok(clr == 0, "got %x\n", clr);
238
240 ok(clr == RGB(255, 0, 0), "got %x\n", clr);
241
243}
244
245static void test_PBM_STEPIT(void)
246{
247 struct stepit_test
248 {
249 int min;
250 int max;
251 int step;
252 } stepit_tests[] =
253 {
254 { 3, 15, 5 },
255 { 3, 15, -5 },
256 { 3, 15, 50 },
257 { -15, 15, 5 },
258 { -3, -2, -5 },
259 { 0, 0, 1 },
260 { 5, 5, 1 },
261 { 0, 0, -1 },
262 { 5, 5, -1 },
263 { 10, 5, 2 },
264 };
266 int i, j;
267
268 for (i = 0; i < ARRAY_SIZE(stepit_tests); i++)
269 {
270 struct stepit_test *test = &stepit_tests[i];
272 LRESULT ret;
273
275
277 ok(ret != 0, "Unexpected return value.\n");
278
280 ok(range.iLow == test->min && range.iHigh == test->max, "Unexpected range.\n");
281
284
285 for (j = 0; j < test->max; j++)
286 {
287 int pos = SendMessageA(progress, PBM_GETPOS, 0, 0);
288 int current;
289
290 pos += test->step;
291 if (test->min != test->max)
292 {
293 if (pos > test->max)
294 pos = (pos - test->min) % (test->max - test->min) + test->min;
295 if (pos < test->min)
296 pos = (pos - test->min) % (test->max - test->min) + test->max;
297 }
298 else
299 pos = test->min;
300
302
304 ok(current == pos, "%u: unexpected position %d, expected %d.\n", i, current, pos);
305 }
306
308 }
309}
310
311static void init_functions(void)
312{
313 HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
314
315#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f);
317#undef X
318}
319
321{
323 ULONG_PTR ctx_cookie;
324 HANDLE hCtx;
325
327
328 iccex.dwSize = sizeof(iccex);
330 pInitCommonControlsEx(&iccex);
331
332 init();
333
334 test_redraw();
337
338 if (!load_v6_module(&ctx_cookie, &hCtx))
339 return;
340
343
344 unload_v6_module(ctx_cookie, hCtx);
345
346 cleanup();
347}
Arabic default style
Definition: afstyles.h:94
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define ARRAY_SIZE(A)
Definition: main.h:33
static void update_window(void)
Definition: wordpad.c:651
cd_progress_ptr progress
Definition: cdjpeg.h:152
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CALLBACK
Definition: compat.h:35
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
#define RGB(r, g, b)
Definition: precomp.h:71
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLint * range
Definition: glext.h:7539
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
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 GLint GLint j
Definition: glfuncs.h:250
__u16 time
Definition: mkdosfs.c:8
struct task_struct * current
Definition: linux.c:32
static void test_PBM_STEPIT(void)
Definition: progress.c:245
static void init(void)
Definition: progress.c:97
static const char progressTestClass[]
Definition: progress.c:33
static HWND create_progress(DWORD style)
Definition: progress.c:36
#define X(f)
static HWND hProgressParentWnd
Definition: progress.c:32
static void cleanup(void)
Definition: progress.c:125
static void test_setcolors(void)
Definition: progress.c:217
static WNDPROC progress_wndproc
Definition: progress.c:72
static LRESULT CALLBACK progress_subclass_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: progress.c:76
static BOOL erased
Definition: progress.c:73
static LRESULT CALLBACK progress_test_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: progress.c:57
static void flush_events(void)
Definition: progress.c:43
static RECT last_paint_rect
Definition: progress.c:74
static void test_redraw(void)
Definition: progress.c:143
static void init_functions(void)
Definition: progress.c:311
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
#define BOOL
Definition: nt_native.h:43
#define L(x)
Definition: ntvdm.h:50
#define WS_CHILD
Definition: pedump.c:617
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_VISIBLE
Definition: pedump.c:620
#define PBM_SETRANGE32
Definition: commctrl.h:2188
#define PBM_SETSTEP
Definition: commctrl.h:2186
#define PBM_GETPOS
Definition: commctrl.h:2194
#define PBM_DELTAPOS
Definition: commctrl.h:2185
#define PBM_SETPOS
Definition: commctrl.h:2184
#define PBM_GETRANGE
Definition: commctrl.h:2193
#define PBM_SETRANGE
Definition: commctrl.h:2183
#define PBS_SMOOTH
Definition: commctrl.h:2180
#define PROGRESS_CLASSA
Definition: commctrl.h:2175
#define ICC_PROGRESS_CLASS
Definition: commctrl.h:63
#define PBM_STEPIT
Definition: commctrl.h:2187
#define CLR_DEFAULT
Definition: commctrl.h:320
#define PBM_SETBARCOLOR
Definition: commctrl.h:2195
#define PBM_SETBKCOLOR
Definition: commctrl.h:2196
#define test
Definition: rosglue.h:37
#define win_skip
Definition: test.h:160
& rect
Definition: startmenu.cpp:1413
HBRUSH hbrBackground
Definition: winuser.h:3170
HICON hIcon
Definition: winuser.h:3168
HINSTANCE hInstance
Definition: winuser.h:3167
HCURSOR hCursor
Definition: winuser.h:3169
int cbWndExtra
Definition: winuser.h:3166
UINT style
Definition: winuser.h:3163
LPCSTR lpszMenuName
Definition: winuser.h:3171
LPCSTR lpszClassName
Definition: winuser.h:3172
WNDPROC lpfnWndProc
Definition: winuser.h:3164
int cbClsExtra
Definition: winuser.h:3165
#define max(a, b)
Definition: svc.c:63
#define GWLP_WNDPROC
Definition: treelist.c:66
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
uint32_t ULONG_PTR
Definition: typedefs.h:65
static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx)
Definition: v6util.h:71
static void unload_v6_module(ULONG_PTR cookie, HANDLE hCtx)
Definition: v6util.h:63
int ret
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
DWORD COLORREF
Definition: windef.h:300
#define WINAPI
Definition: msvc.h:6
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define WM_PAINT
Definition: winuser.h:1620
#define WM_ERASEBKGND
Definition: winuser.h:1625
#define CS_VREDRAW
Definition: winuser.h:658
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define SetWindowLongPtrA
Definition: winuser.h:5345
#define WM_CLOSE
Definition: winuser.h:1621
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define MAKELPARAM(l, h)
Definition: winuser.h:4008
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define COLOR_WINDOW
Definition: winuser.h:918
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI UnregisterClassA(_In_ LPCSTR, HINSTANCE)
BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define CS_HREDRAW
Definition: winuser.h:653
#define IDC_ARROW
Definition: winuser.h:687
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define QS_ALLINPUT
Definition: winuser.h:903
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
#define PM_REMOVE
Definition: winuser.h:1196
BOOL WINAPI UpdateWindow(_In_ HWND)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
#define CW_USEDEFAULT
Definition: winuser.h:225
BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define WM_DESTROY
Definition: winuser.h:1609
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2906
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI GetUpdateRect(_In_ HWND, _Out_opt_ LPRECT, _In_ BOOL)
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2090
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
const char * LPCSTR
Definition: xmlstorage.h:183