Programmatically Launching Windows NT Applications

In our version of RunProcessAndWait, we don’t wait more that 300s (5mn) if the process is still working or stucked,
the function exits with a FALSE return value.

RunAndForgetProcess(..) just run a create the command line process and exit.

Note:

Using DDE in the child process of ‘RunProcessAndWait’ may give some deadlock. (Thank for the comments !)

Enough explanations for a so few code lines!

Return Value:

TRUE if the process was created

FALSE if it not.

See *nRetValue for LastError

Code


#include “windows.h”
#include <process.h>
BOOL RunProcessAndForget(CString sCmdLine,
CString sRunningDir,
int *nRetValue);

BOOL RunProcessAndWait(CString sCmdLine,
CString sRunningDir,
int *nRetValue);

//———————————————————
// Run a synchronized other command line EXE. Returns only
// after this exits. The process is runned as a console window.
// Returns Values : TRUE if the process was created
// FALSE if not.
// see *nRetValue for the LastError number
BOOL RunProcessAndWait(CString sCmdLine,
CString sRunningDir,
int *nRetValue)
{
int nRetWait;
int nError;

// That means wait 300 s before returning an error
// You can change it to the value you need.
// If you want to wait for ever just use ‘dwTimeout = INFINITE’>
DWORD dwTimeout = 1000 *300;

STARTUPINFO stInfo;
PROCESS_INFORMATION prInfo;
BOOL bResult;
ZeroMemory( &stInfo, sizeof(stInfo) );
stInfo.cb = sizeof(stInfo);
stInfo.dwFlags=STARTF_USESHOWWINDOW;
stInfo.wShowWindow=SW_MINIMIZE;

bResult = CreateProcess(NULL,
(LPSTR)(LPCSTR)sCmdLine,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE
| NORMAL_PRIORITY_CLASS,
NULL,
(LPCSTR)sRunningDir,
&stInfo,
&prInfo);
*nRetValue = nError = GetLastError();

if (!bResult) return FALSE;
nRetWait = WaitForSingleObject(prInfo.hProcess,dwTimeout);

CloseHandle(prInfo.hThread);
CloseHandle(prInfo.hProcess);

if (nRetWait == WAIT_TIMEOUT) return FALSE;
return TRUE;
}
//———————————————————
// This function call a command line process.
// Returns Values : TRUE if the process was created
// FALSE if not.
// see *nRetValue for the LastError number
BOOL RunAndForgetProcess(CString sCmdLine,
CString sRunningDir,
int *nRetValue)
{
int nRetWait;
int nError;
STARTUPINFO stInfo;
PROCESS_INFORMATION prInfo;
BOOL bResult;
ZeroMemory( &stInfo, sizeof(stInfo) );
stInfo.cb = sizeof(stInfo);
stInfo.dwFlags=STARTF_USESHOWWINDOW;
stInfo.wShowWindow=SW_MINIMIZE;

bResult = CreateProcess(NULL,
(LPSTR)(LPCSTR)sCmdLine,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE
| NORMAL_PRIORITY_CLASS ,
NULL,
(LPCSTR)sRunningDir ,
&stInfo,
&prInfo);
*nRetValue = nError = GetLastError();

// Don’t write these two lines if you need
CloseHandle(prInfo.hThread);

// to use these handles
CloseHandle(prInfo.hProcess);

if (!bResult) return FALSE;
return TRUE;
}

More by Author

Must Read