2 * PROJECT: ReactOS API Test GUI
3 * LICENSE: GPL - See COPYING in the top level directory
5 * PURPOSE: main dialog implementation
6 * COPYRIGHT: Copyright 2008 Ged Murphy <gedmurphy@reactos.org>
17 WCHAR szPipeName
[] = L
"\\\\.\\pipe\\winetest_pipe";
19 typedef int (_cdecl
*RUNTEST
)(char **);
22 PipeReadThread(LPVOID lpParam
)
28 BOOL bSuccess
= FALSE
;
32 pInfo
= (PMAIN_WND_INFO
)lpParam
;
34 hList
= GetDlgItem(pInfo
->hMainWnd
, IDC_LIST
);
35 hEdit
= GetDlgItem(pInfo
->hMainWnd
, IDC_OUTPUT
);
37 ZeroMemory(&item
, sizeof(LVITEMA
));
38 item
.mask
= LVIF_TEXT
;
43 bSuccess
= ReadFile(pInfo
->hStdOutRd
,
48 if(!bSuccess
|| dwRead
== 0)
53 count
= GetWindowTextLengthA(hEdit
);
54 SendMessageA(hEdit
, EM_SETSEL
, (WPARAM
)count
, (LPARAM
)count
);
55 SendMessageA(hEdit
, EM_REPLACESEL
, 0, (LPARAM
)chBuf
);
57 //item.iItem = ListView_GetItemCount(hList);
58 //item.pszText = chBuf;
59 //SendMessage(hEdit, LVM_INSERTITEMA, 0, (LPARAM)&item);
67 CreateClientProcess(PMAIN_WND_INFO pInfo
)
69 SECURITY_ATTRIBUTES sa
;
71 PROCESS_INFORMATION pi
;
72 BOOL bSuccess
= FALSE
;
75 // Set up the security attributes
77 sa
.nLength
= sizeof(SECURITY_ATTRIBUTES
);
78 sa
.lpSecurityDescriptor
= NULL
;
79 sa
.bInheritHandle
= TRUE
;
82 // Create a pipe for the child process's STDOUT
84 if (!CreatePipe(&pInfo
->hStdOutRd
,
93 // Ensure the read handle to the pipe for STDOUT is not inherited
95 if (!SetHandleInformation(pInfo
->hStdOutRd
,
102 ZeroMemory(&si
, sizeof(STARTUPINFO
));
103 si
.cb
= sizeof(STARTUPINFO
);
104 si
.hStdError
= pInfo
->hStdOutWr
;
105 si
.hStdOutput
= pInfo
->hStdOutWr
;
106 si
.hStdInput
= GetStdHandle(STD_INPUT_HANDLE
);
107 si
.dwFlags
|= STARTF_USESTDHANDLES
;
109 ZeroMemory(&pi
, sizeof(PROCESS_INFORMATION
));
111 bSuccess
= CreateProcessW(pInfo
->lpCmdLine
,
116 0,//CREATE_SUSPENDED,
124 // Create thread to handle pipe input from child processes
126 pInfo
->hPipeThread
= CreateThread(NULL
,
133 WaitForSingleObject(pi
.hProcess
, INFINITE
);
135 CloseHandle(pi
.hProcess
);
136 CloseHandle(pi
.hThread
);
144 OnInitMainDialog(HWND hDlg
,
147 PMAIN_WND_INFO pInfo
;
149 pInfo
= (PMAIN_WND_INFO
)lParam
;
151 /* Initialize the main window context */
152 pInfo
->hMainWnd
= hDlg
;
154 SetWindowLongPtr(hDlg
,
158 pInfo
->hSmIcon
= LoadImageW(hInstance
,
159 MAKEINTRESOURCEW(IDI_ICON
),
169 (LPARAM
)pInfo
->hSmIcon
);
172 pInfo
->hBgIcon
= LoadImageW(hInstance
,
173 MAKEINTRESOURCEW(IDI_ICON
),
183 (LPARAM
)pInfo
->hBgIcon
);
190 RunSelectedTest(PMAIN_WND_INFO pInfo
)
193 WCHAR szTextCmd
[MAX_RUN_CMD
];
196 hRunCmd
= GetDlgItem(pInfo
->hMainWnd
, IDC_TESTSELECTION
);
198 sel
= SendMessageW(hRunCmd
,
204 if (SendMessageW(hRunCmd
,
207 (LPARAM
)szTextCmd
) != CB_ERR
)
209 pInfo
->lpCmdLine
= (LPWSTR
)SendMessage(hRunCmd
,
213 if (pInfo
->lpCmdLine
)
216 // Create a new thread to create the client process
217 // and receive any ouput via stdout
231 AddTestToCombo(PMAIN_WND_INFO pInfo
)
237 hRunCmd
= GetDlgItem(pInfo
->hMainWnd
, IDC_TESTSELECTION
);
240 SendMessageW(hRunCmd
,
243 (LPARAM
)pInfo
->SelectedTest
.szName
);
245 len
= (wcslen(pInfo
->SelectedTest
.szRunCmd
) + 1) * sizeof(WCHAR
);
246 lpExePath
= HeapAlloc(GetProcessHeap(), 0, len
);
250 pInfo
->SelectedTest
.szRunCmd
,
251 len
/ sizeof(WCHAR
));
254 SendMessageW(hRunCmd
,
258 SendMessageW(hRunCmd
,
266 FreeTestCmdStrings(PMAIN_WND_INFO pInfo
)
272 hRunCmd
= GetDlgItem(pInfo
->hMainWnd
, IDC_TESTSELECTION
);
274 cnt
= SendMessageW(hRunCmd
,
280 for (i
= 0; i
< cnt
; i
++)
282 lpExePath
= (LPWSTR
)SendMessage(hRunCmd
,
288 HeapFree(GetProcessHeap(), 0, lpExePath
);
295 MainDlgProc(HWND hDlg
,
300 PMAIN_WND_INFO pInfo
;
302 /* Get the window context */
303 pInfo
= (PMAIN_WND_INFO
)GetWindowLongPtr(hDlg
,
305 if (pInfo
== NULL
&& Message
!= WM_INITDIALOG
)
307 goto HandleDefaultMessage
;
313 return OnInitMainDialog(hDlg
, lParam
);
317 switch(LOWORD(wParam
))
323 ret
= DialogBoxParamW(hInstance
,
324 MAKEINTRESOURCEW(IDD_TESTBROWSER
),
326 (DLGPROC
)BrowseDlgProc
,
330 AddTestToCombo(pInfo
);
336 DialogBoxParamW(hInstance
,
337 MAKEINTRESOURCEW(IDD_OPTIONS
),
339 (DLGPROC
)OptionsDlgProc
,
344 RunSelectedTest(pInfo
);
360 DestroyIcon(pInfo
->hSmIcon
);
362 DestroyIcon(pInfo
->hBgIcon
);
364 FreeTestCmdStrings(pInfo
);
368 HandleDefaultMessage
:
378 wWinMain(HINSTANCE hInst
,
383 INITCOMMONCONTROLSEX iccx
;
384 PMAIN_WND_INFO pInfo
;
387 UNREFERENCED_PARAMETER(hPrev
);
388 UNREFERENCED_PARAMETER(Cmd
);
389 UNREFERENCED_PARAMETER(iCmd
);
393 ZeroMemory(&iccx
, sizeof(INITCOMMONCONTROLSEX
));
394 iccx
.dwSize
= sizeof(INITCOMMONCONTROLSEX
);
395 iccx
.dwICC
= ICC_TAB_CLASSES
;
396 InitCommonControlsEx(&iccx
);
398 pInfo
= HeapAlloc(GetProcessHeap(),
400 sizeof(MAIN_WND_INFO
));
403 Ret
= (DialogBoxParamW(hInstance
,
404 MAKEINTRESOURCEW(IDD_WINETESTGUI
),
406 (DLGPROC
)MainDlgProc
,
407 (LPARAM
)pInfo
) == IDOK
);
409 HeapFree(GetProcessHeap(),