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

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

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

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

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

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

      核心代码如下:


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, "\r\n", 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 += "\r\n";
		
		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, "\r\n", 2, &BytesWrite, 0);
		PeekNamedPipe(m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL);
		ReadFile(m_hReadPipeHandle,ReadBuff,1024,&BytesRead,0);


     

 

相关文章:

  • 2021-09-25
  • 2021-06-15
  • 2021-05-14
  • 2021-07-19
  • 2021-05-06
  • 2022-12-23
猜你喜欢
  • 2021-11-28
  • 2021-06-20
  • 2022-12-23
  • 2021-06-07
  • 2022-12-23
  • 2021-12-04
  • 2021-12-04
相关资源
相似解决方案