Jason Edmeades us@edmeades.me.uk writes:
- /* Internal programs wont be picked up by this, so try one final
createprocess and wait for it to complete.
Note: Ideally we could tell between a console app (wait) and a
windows app, but the API's for it fail in this case */
- ZeroMemory (&st, sizeof(STARTUPINFO));
- st.cb = sizeof(STARTUPINFO);
- init_msvcrt_io_block(&st);
- /* Launch the process and assume CUI so wait on it to complete */
- status = CreateProcess (NULL, command, NULL, NULL, TRUE,
0, NULL, NULL, &st, &pe);
- if ((opt_c || opt_k) && !opt_s && !status &&
GetLastError()==ERROR_FILE_NOT_FOUND && command[0]=='\"') {
- /* strip first and last quote characters and try again */
- WCMD_opt_s_strip_quotes(command);
- opt_s=1;
- WCMD_run_program(command, called);
- return;
- }
- /* If it still fails, give up */
- if (!status) {
- SetLastError(ERROR_FILE_NOT_FOUND);
- WCMD_print_error ();
- /* If a command fails to launch, it sets errorlevel 9009 - which
does not seem to have any associated constant definition */
- errorlevel = 9009;
- return;
- }
- /* Wait for it to end */
- WaitForSingleObject (pe.hProcess, INFINITE);
- GetExitCodeProcess (pe.hProcess, &errorlevel);
- if (errorlevel == STILL_ACTIVE) errorlevel = 0;
- CloseHandle(pe.hProcess);
- CloseHandle(pe.hThread);
You should use the existing CreateProcess code instead of duplicating it all.