我想用WriteConsoleInput这类的低级别api来操纵控制台,编写shell服务器,目前实现了一个客户端,如有多个客户端连接,服务进程创建的每个子cmd进程访问标准输入会有冲突,请问如何创建另外的输入缓冲区供子进程使用,并且还能使用WriteConsoleInput这类api?已经知道CreatePipe创建的管道不可以,它只能用WriteFile写入字符内容。
解决方案 »
- 关于writeprocessmemory向目标进程写入字符串的问题
- Socket 连接问题
- 高分求一函数 CString xor(CString a, CString b)
- 我单独装的MSDN,怎么设置才能在VS环境中按F1就可以链接打开它呢?
- 请问如何用一个程序向另外一个程序发送消息使得该程序中的按扭可用?
- 请问高级程序员每年什么时候报名?一年考几次?报名费是多少?
- 各位:我想在一个对话框里得到另一个对话框的句柄(知道ID),我怎么才能得到呢?来者有分
- 请教IActiveDesktop接口的问题,形势严峻!!!火速解答!!!
- 利用VFW制作一个视频窗口,但是只能显示一帧图像,摄像头是工作的,画面却不动了。。。求大神指导!!
- 我是菜鸟,关于vc++的类是这么理解吗?
- 请问在WIN32下,如何将List Control中的数据保存为TXT格式的文档?
- Measurement Studio 6.0打包问题
因为现在多个CMD.EXE子进程是共享父进程标准输入的,所以有这个现象。能不能通过类似CreateConsoleScreenBuffer之类的方式,创建另外的句柄传给cmd.exe子进程(也就是输入重定向但要求能使用WriteConsoleInput,或者不让子进程继承标准输入编程得到其标准输入操作),我试了CreatePipe不行,创建的句柄只能通过WriteFile写入字符流.
设置dwFlags为STARTF_USESTDHANDLES:
然后自定义:
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
三个流句柄。
这些句柄可以用CreatePipe创建的匿名管道句柄代替:
BOOL CreatePipe(
PHANDLE hReadPipe, // read handle
PHANDLE hWritePipe, // write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe size
);
其中hStdOutput,hStdError传给hWritePipe,hStdInput传给hReadPipe,然后把管道的另一端的句柄保存起来。就可以用ReadFile/WriteFile从这些句柄读取/写入控制台程序的输出/输入。
要注意的是这些句柄的继承性,调用CreateProcess时注意设置BOOL bInheritHandles = TRUE,使它可以继承主进程的句柄。调用CreatePipe要设置LPSECURITY_ATTRIBUTES lpPipeAttributes参数使Pipe的句柄能够被继承。
此外,这样使CreatePipe创建的两个句柄都可以被继承了,所以要调用DuplicateHandle把不需要传入子进程的句柄设置为不可继承。不然子进程拥有了另一个句柄但是不会调用Closehandle减少引用记数,会导致Pipe不能被在使用完毕后被撤消。
此外注意关闭所有使用过的内核对象句柄。