init
V2EX  ›  问与答

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

  •  
  •   init · Apr 22, 2016 · 1621 views
    This topic created in 3753 days ago, the information mentioned may be changed or developed.

    自己想写个界面的小工具, 点一个 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 replies    2016-04-24 00:06:41 +08:00
    kevinzhwl
        1
    kevinzhwl  
       Apr 22, 2016
    仅供参考

    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  
       Apr 22, 2016   ❤️ 1
    cmd 可以启动了,其他的就看你自己的了
    init
        3
    init  
    OP
       Apr 24, 2016
    @kevinzhwl 大神 我现在遇到一个新的问题, 就是我开启子进程之后发送命令 cmd 对话框没有显示执行的结果但是从 pipe 能读到指令这是为什么
    http://stackoverflow.com/questions/36812628/create-cmd-subprocess-can-receive-parent-process-order-but-cant-exec-it
    这是我提出的问题
    还是很感谢您回答我上个问题的哈!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2946 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:59 · PVG 15:59 · LAX 00:59 · JFK 03:59
    ♥ Do have faith in what you're doing.