V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
init
V2EX  ›  问与答

有关 mfc 中创建进程的问题。

  •  
  •   init · 2016-04-22 12:34:24 +08:00 · 1253 次点击
    这是一个创建于 3172 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己想写个界面的小工具, 点一个 button 就向已经打开的 cmd 窗口发送一条命令(所有命令都在这一个 cmd 窗口处理) 我采用的是匿名管道 现在目前遇到的问题是 我点击 button 之后没有程序没有反应, 既没有报错也没有崩溃 尝试打印信息之后,发现程序运行到创建进程之后就过不去了,开了任务管理器也没有发现有 cmd 进程 哪位能指点一下或者提供一下能实现我这需求的思路也行 代码如下

    void CeeDlg::OnBnClickedButton3()
    {
    	
    	// TODO:  在此添加控件通知处理程序代码
    
    	DWORD ErrorCode;
    	DWORD dw = -1;
    	char ErrorString[500];
    	HANDLE hRead, hWrite, dWrite, dRead;
    
    	SECURITY_ATTRIBUTES sa;      //创建安全信息结构体  
    	sa.bInheritHandle = true;
    	sa.lpSecurityDescriptor = 0;
    	sa.nLength = sizeof(sa);
    
    	CreatePipe(&dRead, &dWrite, &sa, 4096);  //创建输入管道  
    	if (ErrorCode = GetLastError())
    	{
    		std::cout << "创建输出管道失败!" << std::endl;
    	}
    	
    	STARTUPINFO si;        //创建进程开始信息结构体  
    	GetStartupInfo(&si);
    	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    	si.wShowWindow = SW_SHOW;
    	si.hStdOutput = dRead;
    	si.hStdInput = dWrite;
    		
    	CString temp2("C:\\Windows\\System32\\cmd.exe");
    	char cmdline[100];
    	sprintf_s(cmdline, "%s", temp2);
    
            PROCESS_INFORMATION pi;     //创建进程  
    	CreateProcessW(_T("cmdline"), NULL, NULL, NULL, true, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);  //此为命令窗口所用的创建进程语句  
    	
    	if (rrorCode = GetLastError())
    	{
    		std::cout << "创建进程失败!" << std::endl;
    		MessageBox(_T("CreateProcess Failed!"), _T("提示"), MB_OK | MB_ICONWARNING);
    
    	}
    }
    
    3 条回复    2016-04-24 00:06:41 +08:00
    kevinzhwl
        1
    kevinzhwl  
       2016-04-22 21:44:31 +08:00
    仅供参考

    STARTUPINFO si={0}; //创建进程开始信息结构
    si.cb =sizeof(STARTUPINFO);
    GetStartupInfo(&si);
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.wShowWindow = SW_SHOW;
    si.hStdOutput = dRead;
    si.hStdInput = dWrite;

    CString temp2("C:\\Windows\\System32\\cmd.exe");
    TCHAR cmdline[100];
    _stprintf_s(cmdline, _T("%s"), temp2);

    PROCESS_INFORMATION pi={0}; //创建进程
    BOOL bOK = CreateProcess(cmdline,NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); //此为命令窗口所用的创建进程语句

    if (!bOK /*&&(ErrorCode = GetLastError())*/)
    {
    std::cout << "创建进程失败!" << std::endl;
    MessageBox(_T("CreateProcess Failed!"), _T("提示"), MB_OK | MB_ICONWARNING);

    }
    kevinzhwl
        2
    kevinzhwl  
       2016-04-22 21:45:02 +08:00   ❤️ 1
    cmd 可以启动了,其他的就看你自己的了
    init
        3
    init  
    OP
       2016-04-24 00:06:41 +08:00
    @kevinzhwl 大神 我现在遇到一个新的问题, 就是我开启子进程之后发送命令 cmd 对话框没有显示执行的结果但是从 pipe 能读到指令这是为什么
    http://stackoverflow.com/questions/36812628/create-cmd-subprocess-can-receive-parent-process-order-but-cant-exec-it
    这是我提出的问题
    还是很感谢您回答我上个问题的哈!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:23 · PVG 04:23 · LAX 12:23 · JFK 15:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.