MFC中的CreateProcess函数的应用

5 篇文章 1 订阅

MFC与CMD信息的传递与返回

	HANDLE hRead,hWrite;
	SECURITY_ATTRIBUTES sa;    
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);    
	sa.lpSecurityDescriptor = NULL; //使用系统默认的安全描述符    
	sa.bInheritHandle = TRUE; //创建的进程继承句柄

	if (!CreatePipe(&hRead,&hWrite,&sa,0)) //创建匿名管道
	{        
		MessageBox("CreatePipe Failed!","提示",MB_OK | MB_ICONWARNING);        
		return;
	}

	STARTUPINFO si;    
	PROCESS_INFORMATION pi;

	ZeroMemory(&si,sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);    
	GetStartupInfo(&si);    
	si.hStdError = hWrite;    
	si.hStdOutput = hWrite;    //新创建进程的标准输出连在写管道一端

//	si.wShowWindow = SW_HIDE; //隐藏窗口  
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

	char cmdline[200]; 
 	CString tmp,stredit2;
 	GetDlgItemText(IDC_EDIT2,stredit2); //获取编辑框中输入的命令行
 	tmp.Format("cmd /c %s",stredit2);
 	sprintf(cmdline,"%s",tmp);

if (!CreateProcess(NULL,
    		cmdline,
    		NULL,
    		NULL,
    		TRUE,/*打开句柄都将被子进程继承,信息的交互*/
    		CREATE_NO_WINDOW,/*这里不为该进程创建一个控制台窗口,不显示cmd执行窗口*/
    		NULL,
    		NULL,
    		&si,&pi)) //创建子进程
    	{
    		MessageBox("CreateProcess Failed!","提示",MB_OK | MB_ICONWARNING);        
    		return;
    	}
    	CloseHandle(hWrite); //关闭管道句柄

	char buffer[4096] = {0};
	CString strOutput;
	DWORD bytesRead;

	while (true) 
	{
		if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL) //读取管道
			break;

		strOutput += buffer;
		SetDlgItemText(IDC_EDIT1,strOutput); //显示输出信息到编辑框,并刷新窗口
		UpdateWindow();
		Sleep(100);
	}
	CloseHandle(hRead);

MFC调用bat文件

	PROCESS_INFORMATION pi;
	STARTUPINFO si;
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
	if (CreateProcess("循环执行.bat",// 循环执行.bat位于工程所在目录下
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,// 这里为该进程创建一个控制台窗口
		NULL,
		NULL,
		&si, &pi))
	{
//		WaitForSingleObject(pi.hProcess, INFINITE);// 等待bat执行结束

		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}

两者CreateProcess的不同
1: if(!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi)) //创建子进程
2:if (CreateProcess(“循环执行.bat”,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si, &pi)) // 循环执行.bat位于工程所在目录下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MFCCreateProcess出错的解决方法可以参考以下代码: ```c++ // 定义一个启动信息结构体 STARTUPINFO si = { 0 }; si.cb = sizeof(STARTUPINFO); // 定义一个进程信息结构体 PROCESS_INFORMATION pi = { 0 }; // 定义要启动的程序路径 LPCTSTR lpApplicationName = _T("D:\\test.exe"); // 定义要传递给程序的命令行参数 LPTSTR lpCommandLine = _T("param1 param2"); // 创建进程 BOOL bRet = CreateProcess(lpApplicationName, lpCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); if (bRet) { // 进程创建成功 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { // 进程创建失败 DWORD dwError = GetLastError(); // 处理错误 } ``` 上述代码,我们首先定义了一个启动信息结构体STARTUPINFO和一个进程信息结构体PROCESS_INFORMATION,这两个结构体用于存储进程的启动信息和进程的信息。然后定义了要启动的程序路径和要传递给程序的命令行参数。最后调用CreateProcess函数创建进程。 CreateProcess函数的参数如下: - lpApplicationName:要运行的可执行文件路径。 - lpCommandLine:要传递给可执行文件的命令行参数。 - lpProcessAttributes:描述新进程的安全性。 - lpThreadAttributes:描述新线程的安全性。 - bInheritHandles:指定新进程是否可以继承父进程的句柄。 - dwCreationFlags:指定新进程的一些标志,如CREATE_NEW_CONSOLE或CREATE_SUSPENDED等。 - lpEnvironment:指定新进程的环境变量。 - lpCurrentDirectory:指定新进程的当前目录。 - lpStartupInfo:指向一个STARTUPINFO结构体,包含了新进程的一些属性。 - lpProcessInformation:指向一个PROCESS_INFORMATION结构体,包含了新进程的信息。 需要注意的是,如果CreateProcess函数返回FALSE,需要调用GetLastError函数获取错误码,以便定位问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abyssal丶Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值