TCHAR szCmdLine[]={TEXT("E:\\CPL-server\\其他工具\\restartSrv\\bin\\opensavepath.exe")}; TCHAR static szCommandLine[MAX_PATH + 700] = {0}; lstrcpy(szCommandLine, pProgramPath); STARTUPINFO si = {0}; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.wShowWindow = SW_SHOW; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 運行進程 PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); BOOL bRet = FALSE; bRet = CreateProcess(pProgramPath, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi); ///<關閉Restartsrv不會關閉創建進程子窗口> //BOOL bRet = CreateProcess( // NULL, // name of executable module // szCmdLine, // command line string // NULL, // process attributes // NULL, // thread attributes // FALSE, // handle inheritance option // CREATE_NEW_CONSOLE, // creation flags // NULL, // new environment block // NULL, // current directory name // &si, // startup information // &pi); // process information if( bRet ) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } //ShellExecute(NULL, "open", szCmdLine, NULL, NULL, SW_SHOWNORMAL); return bRet;
都說通過createprocess函數創建的另一個進程(打開另一個程序),關閉父進程一般不會關閉子進程。
但是最近測試發現如果使用一個控制台程序使用createprocess函數打開另一個控制台程序,而且dwCreationFlags參數不指定為CREATE_NEW_CONSOLE或者DETACHED_PROCESS值。那么關閉父進程也會關閉子進程。
如果使用一個控制台程序使用createprocess函數打開的是一個窗口程序,關閉父進程確實不會關閉子進程。
另外在控制台程序中使用 ShellExecute(NULL, "open", szCmdLine, NULL, NULL, SW_SHOWNORMAL);打開一個進程控制台程序或者窗口程序,關閉父進程對子進程都沒有影響。
所有,我猜測是因為使用控制台程序打開另一個控制台程序,不特別指定創建新控制台窗口或者脫離父進程,他們使用的是同一個控制台,沒有創建新的控制台窗口,所有關閉這個控制台窗口相當於關閉了兩個控制窗口。