Enhanced version of the CreateProcess function






4.57/5 (17 votes)
Apr 27, 2004
1 min read

152177

2815
Waits for the child process to exit, minimizes the main window while the child process runs, and automatically restores the window when it exits.
Introduction
In one of my programs, I needed to wait until an external application finished processing some data, and wanted to minimize the main window during that time to prevent the user from doing anything else before the results were available. That's why I wrote CreateProcessEx
.
The CreateProcessEx
function takes seven parameters but only the first two are required:
lpAppName
:Pointer to a null-terminated string that specifies the application to execute. The string can specify the full path and file name of the application to execute, or it can specify a partial name.If
lpAppName
isNULL
, the application name must be the first white space-delimited token in thelpCmdLine
string.lpCmdLine
: Pointer to a null-terminated string that specifies the command line to execute. This parameter can beNULL
.bAppInCmdLine
: Indicates if thelpAppName
string must be used as the first white space-delimited token in thelpCmdLine
string.bCompletePath
: Indicates if thelpAppName
string specifies a partial name that must be completed using the path of the calling process.bWaitForProcess
: Indicates if the calling process must wait until child process exits.bMinimizeOnWait
: Indicates if the main window will be minimized while the child process runs and automatically restored when it exits.hMainWnd
: Handle of the main window to be minimized. IfhMainWnd
isNULL
, thenAfxGetMainWnd()
is used.
DWORD CreateProcessEx ( LPCSTR lpAppPath, LPCSTR lpCmdLine, BOOL bAppInCmdLine, BOOL bCompletePath, BOOL bWaitForProcess, BOOL bMinimizeOnWait, HWND hMainWnd ) { STARTUPINFO startupInfo; PROCESS_INFORMATION processInformation; char szAppPath [ _MAX_PATH ]; char szCmdLine [ _MAX_PATH ]; char drive [ _MAX_DRIVE ]; char dir [ _MAX_DIR ]; char name [ _MAX_FNAME ]; char ext [ _MAX_EXT ]; szAppPath[ 0 ] = '\0'; szCmdLine[ 0 ] = '\0'; ZeroMemory( &startupInfo, sizeof( STARTUPINFO )); startupInfo.cb = sizeof( STARTUPINFO ); ZeroMemory( &processInformation, sizeof( PROCESS_INFORMATION )); if ( bCompletePath ) { GetModuleFileName( GetModuleHandle( NULL ), szAppPath, _MAX_PATH ); _splitpath( szAppPath, drive, dir, NULL, NULL ); _splitpath( lpAppPath, NULL, NULL, name, ext ); _makepath ( szAppPath, drive, dir, name, strlen( ext ) ? ext : ".exe" ); } else strcpy( szAppPath, lpAppPath ); if ( bAppInCmdLine ) { strcpy( szCmdLine, "\"" ); strcat( szCmdLine, szAppPath ); strcat( szCmdLine, "\"" ); } if ( lpCmdLine ) { // We must use quotation marks around the command line (if any)... if ( bAppInCmdLine ) strcat( szCmdLine, " \"" ); else strcpy( szCmdLine, "\"" ); strcat( szCmdLine, lpCmdLine ); strcat( szCmdLine, "\"" ); } DWORD dwExitCode = -1; if ( CreateProcess( bAppInCmdLine ? NULL: szAppPath, // lpszImageName szCmdLine, // lpszCommandLine 0, // lpsaProcess 0, // lpsaThread FALSE, // fInheritHandles DETACHED_PROCESS, // fdwCreate 0, // lpvEnvironment 0, // lpszCurDir &startupInfo, // lpsiStartupInfo &processInformation // lppiProcInfo )) { if ( bWaitForProcess ) { if ( bMinimizeOnWait ) if ( IsWindow( hMainWnd )) ShowWindow( hMainWnd, SW_MINIMIZE ); #ifdef __AFX_H__ else AfxGetMainWnd()->ShowWindow( SW_MINIMIZE ); #endif WaitForSingleObject( processInformation.hProcess, INFINITE ); if ( bMinimizeOnWait ) if ( IsWindow( hMainWnd )) ShowWindow( hMainWnd, SW_RESTORE ); #ifdef __AFX_H__ else AfxGetMainWnd()->ShowWindow( SW_RESTORE ); #endif GetExitCodeProcess( processInformation.hProcess, &dwExitCode ); } else { CloseHandle( processInformation.hThread ); CloseHandle( processInformation.hProcess ); dwExitCode = 0; } } return dwExitCode; }
To use the function, simply include the CreateProcessEx.h and CreateProcessEx.cpp files in your project. That's it!