0
回答
关于VC实现cmd回显的问题
终于搞明白,存储TCO原来是这样算的>>>   
刚学完孙鑫老师的《VC++深入详解》,在网上找了一些关于使用匿名管道实现cmd回显的资料,调试的时候,
点击按钮之后并没有在编辑框中回显DOS命令的结果,反而是创建了一个与原程序一模一样的进程,再次点击按钮,又创建了一个,
这是怎么回事,网上找的代码大多是一样,可为什么我出现了这种问题?求教大神!!!先行感谢!!!
以下是按钮响应的函数:
        SECURITY_ATTRIBUTES sa;
	HANDLE hRead,hWrite;
		
	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,NULL,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);    
<无标签>
举报
A-A
发帖于4年前 0回/521阅
顶部