双管道与cmd.exe进程间通信演示
看《老狼Gh0st远程协助软件编写系列教程(上半部)》视频的时候,4.1节有讲到双管道与cmd.exe进程间通信。所写的demo工程只能一次输入一个命令,然后返回。再次输入的时候会出现问题。在这里,我改进了一下代码,每次都可以输入命令,然后返回结果。
简单的MFC程序如下,启动之后,不管是否在命令输入框里输入内容,点击确定都只是出现cmd.exe的启动信息,如下图所示:
之后,就可以在命令输入中敲入代码,例如dir命令,结果显示如下:
在这里需要注意的地方,有些命令执行时间很长,点击确定之后不一定一次能够把命令结果完全显示出来,只需要再次点击确定,就可以把剩余的结果显示出来了。
核心代码如下:
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);
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。