您的位置:首页 > 编程语言 > C语言/C++

VC++启动一个新的进程

2014-11-26 16:22 316 查看
//TCHAR szApplicationName[] = TEXT("UpdateMi.exe") ;  
	TCHAR szCommandLine[MAX_PATH];
	memset(szCommandLine,0,sizeof(szCommandLine));
 	lstrcpy(szCommandLine,_T("UpdateMi.exe "));//要启动的进程
	lstrcat(szCommandLine,_T("TestProcess"));//传给刚启动的进程的参数
	STARTUPINFO si = {sizeof(si)} ;  
	PROCESS_INFORMATION pi ; 
	BOOL bRet=CreateProcess(
		NULL,//NULL,					// name of executable module
		szCommandLine,			// command line string
		NULL,					// process attributes
		NULL,					// thread attributes
		FALSE,					// handle inheritance option
		CREATE_UNICODE_ENVIRONMENT|CREATE_NEW_CONSOLE,//0,		UNICODE版本下				// creation flags
		NULL,					// new environment block
		NULL,					// current directory name
		&si,					// startup information
		&pi); 				// process information
	if(bRet)
	{
		 CloseHandle(pi.hThread);// 关闭子进程的主线程句柄
		 CloseHandle(pi.hProcess);// 关闭子进程句柄
	} 
	//子进程有时需要在自己的程序中关闭父进程,可以在创建子进程时把父进程名称传进去
	//关闭
	CString cstrCmdLine=AfxGetApp()->m_lpCmdLine; 
	MessageBox(cstrCmdLine);
	if(cstrCmdLine!=_T(""))
	{
		HWND hWndRun=::FindWindow(NULL,cstrCmdLine);//_T("Dialog"),_T("CLogonDlg")
		for(int i=0;i<5 && hWndRun!=NULL;i++)//多关闭几次
		{
			::PostMessage(hWndRun,WM_QUIT,0,0);//18
			hWndRun = ::FindWindow(NULL,cstrCmdLine);
			Sleep(10);
		}
	}
	 
//第二种方法
 //启动
  SHELLEXECUTEINFO ShExecInfo;
  ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
  ShExecInfo.hwnd = NULL;
  ShExecInfo.lpVerb =_T("runas")  /*NULL*/;
  ShExecInfo.lpFile =_T("UpdateMi.exe"); //can be a file as well
  ShExecInfo.lpParameters =szCommandLine/*_T("PROCESS")*/; 
  ShExecInfo.lpDirectory = NULL;
  ShExecInfo.nShow = SW_SHOW;
  ShExecInfo.hInstApp = NULL; 
  ShellExecuteEx(&ShExecInfo);
  //关闭
  if( ShExecInfo.hProcess != NULL)
  {
      TerminateProcess(ShExecInfo.hProcess,0);
      ShExecInfo.hProcess = NULL;
  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: