關於CreateProcess函數一些經驗


	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);打開一個進程控制台程序或者窗口程序,關閉父進程對子進程都沒有影響。

 

所有,我猜測是因為使用控制台程序打開另一個控制台程序,不特別指定創建新控制台窗口或者脫離父進程,他們使用的是同一個控制台,沒有創建新的控制台窗口,所有關閉這個控制台窗口相當於關閉了兩個控制窗口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM