实现进程间的通信(管道方法)
有这样一个场景,我的A程序需要利用另外一个程序,并不是简单的调用,而是与此程序实现交互式的操作,比如cmd.exe。我需要向里面输入命令并且得到结果,怎么办?
这样就涉及到了进程间通信的问题。
我想到利用 CreateProcess 来创建cmd进程, 在这个方法中有一个很复杂的参数,
即 STARTUPINFO 结构体,用来指定新进程的主窗口特性,这个结构体包括了这个程序所使用的输入和输出的缓存句柄:
HANDLE hStdInput;
HANDLE hStdOutput;
在标准输入输出中,hStdInput为键盘缓存的句柄,而hStdOutput为控制台窗口的缓存句柄。
但是我们不是标准输入输出,我们要用自定义的内存来实现,因为这片内存才是我们可控的。管道(Pipe)即是我想要的这段内存。
管道有两个最基本的句柄指针,一个指向读,一个指向写。在写指针进行写操作之后,读指针可以进行读操作。
这样就有了最基本的思路: A程序->cmd.exe_input->执行->cmd.exe_output->A程序
所以需要申明四个变量
m_hWritePipeHandle = NULL;//A程序向管道写
m_hReadPipeShell = NULL;//cmd读取写的内容
m_hWritePipeShell = NULL;//cmd向管道写
m_hReadPipeHandle = NULL; //A程序从管道中读出内容
//建立管道
CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0);
CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0);
//输入输出绑定
STARTUPINFO si = {0};
si.hStdInput = m_hReadPipeShell;
si.hStdOutput = si.hStdError = m_hWritePipeShell;
//进程建立
CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
最后,只需要新建两个线程来分别实现对m_hWritePipeHandle的写,和对m_hReadPipeHandle的读,即可
大功告成!