关于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);打开一个进程控制台程序或者窗口程序,关闭父进程对子进程都没有影响。

所有,我猜测是因为使用控制台程序打开另一个控制台程序,不特别指定创建新控制台窗口或者脱离父进程,他们使用的是同一个控制台,没有创建新的控制台窗口,所有关闭这个控制台窗口相当于关闭了两个控制窗口。

时间: 2024-10-12 08:42:03

关于CreateProcess函数一些经验的相关文章

windows - 进程 - CreateProcess函数详解

CreateProcess函数原型如下: [cpp] view plaincopy BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL bInheritHandles, DWORD fdwCreate, PVOID pvEnvironment, PCTSTR pszCurD

CreateProcess函数

调用CreateProcess函数来创建一个进程: 一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1.进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构--可以把进程内核对象想象成由进程统计信息构成的一个小型数据结构.然后,系统为新进程创建一个虚拟地址空间,并将可执行文件(和所有必要的DLL)的代码及数据加载到进程的地址空间 然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1).和进程内核对象一样,线程内核对象也是一个小型

CreateProcess函数具体解释

CreateProcess说明:WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程执行指定的可执行文件. 函数原型:BOOL CreateProcess(    LPCTSTR lpApplicationName,            LPTSTR lpCommandLine,            LPSECURITY_ATTRIBUTES lpProcessAttributes.    LPSECURITY_ATTRIBUTES lpThreadAt

CreateProcess函数诡异的表现

场景:程序A使用CreateProcess函数去启动另一个程序(.exe)文件,在绝大部分情况下是可以成功启动的,但是在某些电脑上无效. 因为这“某些电脑”实在不好找,终于有一天借到一台这样的电脑. 经过多次实验发现,CreateProcess返回值总为-1,也就是成功创建了进程,而且我是用showPrompt,弹窗打印的该值,如果弹窗,就能创建进程. 最后猜想可能是因为CreateProcess之后,随即程序退出了,并不会等程序B创建完成,会不会太快了,导致电脑没反应过来.最后加了一个Slee

CreateProcess 函数

进程的创建:可以使用CreateProcess 函数 来源:MSDN(竟然不允许MSDN链接 靠 无语) BOOL CreateProcess ( LPCTSTRlpApplicationName, LPTSTRlpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes. LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,

CreateProcess函数回来的进程ID和任务管理器的不同

1 void Proc() 2 { 3 STARTUPINFO si = { 0 }; 4 PROCESS_INFORMATION pi = { 0 }; 5 CreateProcess("c:/windows/system32/calc.exe", "", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 6 printf("进程ID=%d,进程句柄%d\n", pi.dwProcessI

[转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂.    WinExec 两个参数,前一个指定路径,后一个指定显示方式.    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等.    Cr

浅谈一类积性函数的前缀和(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/50500009 另外,莫比乌斯反演和杜教筛其他可转到 http://blog.leanote.com/post/totziens/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%8F%8D%E6%BC%94 写在前面 笔者在刷题过程中遇到一些求积性函数前缀和的问题,其中有一类问题需要在低于线性时间复杂度的算法,今天就来浅析一下这类问题的求解方法,当作以后讲课

[转]WinExec、ShellExecute和CreateProcess及返回值判断方式

[转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/2392472.html 有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT u