牛骨文教育服务平台(让学习变的简单)
博文笔记

双管道与cmd.exe进程间通信演示

创建时间:2017-06-02 投稿人: 浏览次数:711

      看《老狼Gh0st远程协助软件编写系列教程(上半部)》视频的时候,4.1节有讲到双管道与cmd.exe进程间通信。所写的demo工程只能一次输入一个命令,然后返回。再次输入的时候会出现问题。在这里,我改进了一下代码,每次都可以输入命令,然后返回结果。

      简单的MFC程序如下,启动之后,不管是否在命令输入框里输入内容,点击确定都只是出现cmd.exe的启动信息,如下图所示:

cmdpipe_001

      之后,就可以在命令输入中敲入代码,例如dir命令,结果显示如下:

cmdpipe_002

      在这里需要注意的地方,有些命令执行时间很长,点击确定之后不一定一次能够把命令结果完全显示出来,只需要再次点击确定,就可以把剩余的结果显示出来了。

      核心代码如下:

void CCmdPipeDlg::ReadPipe()
{
	
	unsigned long   BytesRead = 0;
	unsigned long   BytesWrite = 0;
	char	ReadBuff[1024];
	int ret;
	DWORD	TotalBytesAvail;
	memset(ReadBuff, 0, sizeof(ReadBuff));
	ret = PeekNamedPipe(m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL);
	if (BytesRead)
	{
		LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, TotalBytesAvail + 1);
		ReadFile(m_hReadPipeHandle, lpBuffer, TotalBytesAvail, &BytesRead, NULL);
		SetDlgItemText(IDC_EDIT2, (char*)lpBuffer);
		LocalFree(lpBuffer);
	}
	else
	{
		WriteFile(m_hWritePipeHandle, "
", 2, &BytesWrite, 0);
		PeekNamedPipe(m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL);
		ReadFile(m_hReadPipeHandle,ReadBuff,1024,&BytesRead,0);
		BytesRead = 0;
		UpdateData(true);
		unsigned long	ByteWrite;
		m_strCmd += "
";
		
		WriteFile(m_hWritePipeHandle, m_strCmd.GetBuffer(0), m_strCmd.GetLength(), &ByteWrite, NULL);
		//
		Sleep(100);
		
		memset(ReadBuff, 0, sizeof(ReadBuff));
		PeekNamedPipe(m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL);
		LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, TotalBytesAvail + 1);
		ReadFile(m_hReadPipeHandle, lpBuffer, TotalBytesAvail, &TotalBytesAvail, NULL);
		SetDlgItemText(IDC_EDIT2, (char*)lpBuffer);
		LocalFree(lpBuffer);
	}
}
       注意其中的Sleep(100),本意是等待某些需要长时间执行时间的命令执行完成,再继续执行下面的代码。但是命令执行时间长短由系统决定,所以这个控制的也不好。


  
WriteFile(m_hWritePipeHandle, "
", 2, &BytesWrite, 0);
		PeekNamedPipe(m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL);
		ReadFile(m_hReadPipeHandle,ReadBuff,1024,&BytesRead,0);


  


  
     

 

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。