///////////////////////////////////////////////////////////////////////////// // Creation 16/12/2003 // // // CREATEPROCESS.C // --------------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // Show CreateProcess usage // ///////////////////////////////////////////////////////////////////////////// #include #include #include ///////////////////////////////////////////////////////////////////////////// // // STARTEXE ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --StartExe-- // ARGUMENTS // Argument1: LPCTSTR pszCommandLine // Argument3: LPCTSTR pszArgs // Argument4: HANDLE * phProcess // RETOUR/RESULTAT // DWORD // REMARQUE // Rev 16/12/2003 ////////////////////////////////////////////////////////////////////////////// DWORD StartExe( LPCTSTR pszCommandLine, LPCTSTR pszArgs, HANDLE * phProcess ) { TCHAR szExecutable[MAX_PATH]; STARTUPINFO si; PROCESS_INFORMATION pi; int cbLen; BOOL fRacine = FALSE; TCHAR pszCommand[MAX_PATH]; int nRet; // Tests preliminaires if( pszCommandLine == NULL ) return FALSE; _tcscpy( pszCommand, pszCommandLine ); // Cas du \ cbLen = _tcsclen(pszCommand); if( cbLen > 0 ) { if( pszCommand[cbLen-1] == '\\' || pszCommand[cbLen-1] == '/' ) { // Cas de l'exe lancer a partir de la racine if( cbLen > 1 && pszCommand[cbLen-2] == ':') fRacine = TRUE; if( ! fRacine ) pszCommand[cbLen-1] = 0; } } // Structure du CreateProcess memset(&si,0,sizeof(si)); memset(&pi,0,sizeof(pi)); si.cb = sizeof(STARTUPINFO); // On concatene les chemins _stprintf(szExecutable,TEXT("%s"), pszCommand ); // On concatene les arguments si y'en a if( pszArgs != NULL ) { _tcscat( szExecutable, TEXT(" ") ); _tcscat( szExecutable, pszArgs ); } nRet = CreateProcess(NULL, szExecutable, NULL, NULL, FALSE, #ifndef _WIN32_WCE 0//DETACHED_PROCESS if DETACHED_PROCESS, printf() don't go to the console #else 0 #endif , NULL, __TEXT("\\"), &si, &pi); if( ! nRet ) { return 0; } *phProcess = pi.hProcess; CloseHandle( pi.hThread ); return pi.dwProcessId; } ///////////////////////////////////////////////////////////////////////////// // // MAIN ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --main-- // // Start cmd with /c notepad as argument // => run notepad // // ARGUMENTS // RETOUR/RESULTAT // int // REMARQUE // Rev 16/12/2003 ////////////////////////////////////////////////////////////////////////////// int main() { HANDLE hProcess; DWORD dwProcess; TCHAR szPathCmd[MAX_PATH]; // Retrieve winnt\system32 path GetSystemDirectory( szPathCmd, MAX_PATH ); _tcscat( szPathCmd, TEXT("\\cmd.exe") ); // start child dwProcess = StartExe( szPathCmd, TEXT("/c notepad.exe"), &hProcess ); // Wait process end (facultative) WaitForSingleObject( hProcess, INFINITE ); return ! CloseHandle( hProcess ); }