DWORD run_Execute(LPCTSTR lpszFile, LPCTSTR lpszParam)
{
DWORD exitCode = 0;
PROCESS_INFORMATION pInfo = {0};
STARTUPINFO sInfo = {0};
sInfo.cb = sizeof(STARTUPINFO);
sInfo.wShowWindow = SW_SHOW;
int nCmdLen = (_tcslen(lpszFile) + _tcslen(lpszParam) + 2) * sizeof(TCHAR);
LPTSTR lpszCmd = (LPTSTR)_alloca(nCmdLen);
memset(lpszCmd, 0, nCmdLen);
_tcscpy(lpszCmd, lpszFile);
if(lpszParam)
{
_tcscat(lpszCmd, _T(" "));
_tcscat(lpszCmd, lpszParam);
}
if(CreateProcess(
NULL, //LPCTSTR lpApplicationName, // pointer to name of executable module
lpszCmd, //LPTSTR lpCommandLine, // pointer to command line string
NULL, //LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
NULL, //LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
FALSE, //BOOL bInheritHandles, // handle inheritance flag
0, //DWORD dwCreationFlags, // creation flags
NULL, //LPVOID lpEnvironment, // pointer to new environment block
NULL, //LPCTSTR lpCurrentDirectory, // pointer to current directory name
&sInfo, //LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
&pInfo)) //LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
{
// Wait until child process exits.
WaitForSingleObject( pInfo.hProcess, INFINITE );
if (GetExitCodeProcess(pInfo.hProcess, &exitCode))
{
TRACE( _T("Exit code = %d/n"), exitCode);
}
else
{
TRACE( _T("GetExitCodeProcess() failed: %ld/n"), GetLastError());
ASSERT(0);
}
// Close process and thread handles.
CloseHandle( pInfo.hProcess );
CloseHandle( pInfo.hThread );
}
else
{
TRACE( _T("CreateProcess() failed: %ld/n"), GetLastError());
ASSERT(0);
}
return exitCode;
}