windows sdk编程系列文章18 ---- 管道

windows sdk编程系列文章18 ---- 管道

ID:11206840

大小:52.00 KB

页数:11页

时间:2018-07-10

windows sdk编程系列文章18 ---- 管道_第1页
windows sdk编程系列文章18 ---- 管道_第2页
windows sdk编程系列文章18 ---- 管道_第3页
windows sdk编程系列文章18 ---- 管道_第4页
windows sdk编程系列文章18 ---- 管道_第5页
资源描述:

《windows sdk编程系列文章18 ---- 管道》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、windowssdk编程系列文章----管道2008-04-1722:58这一讲将探索一下管道,看看它是什么、有什么用。为使之更加生动有趣,我将用怎样改变Edit控件的背景色和文本颜色来说明此技术。理论:管道,顾名思义就是有两个端的通道。可以使用管道在进程间、同一进程内进行数据交换,就像手提式无线电话机一样。把管道的一端给另一方,他就可以借助管道和你通讯了。有两种管道,即有名管道和匿名管道。匿名管道就是没有名字的管道了,也就是说在使用它们时不需要知道其名字。而有名管道正好相反,在使用前必须知道其名字。也可以根据管道的特性来分类,即是单向的还是双向的。单向管道,数据

2、只能沿一个方向移动,从一端流向另一端,而双向管道数据可以在两端间自由交换。匿名管道通常是单向的而有名管道通常是双向的。有名管道常用于一个服务器联络多个客户端的网络环境。这一讲将详细讨论一下匿名管道。匿名管道主要目的是作为父进程与子进程、子进程之间通讯的联结通路。在处理控制台问题时,匿名管道是相当有用的。控制台应用程序就是使用控制台作为输入和输出的一种Win32应用程序。一个控制台就像一个DOS窗口。但控制台应用程序的的确确是32位的应用程序,它可以向其它图形程序一样使用GUI函数,只不过它碰巧使用了控制台罢了。控制台应用程序有三个用于输入输出的标准句柄,它们是标准

3、输入、标准输出和标准错误句柄。标准输入用于从控制台读或取信息而标准输出用于往控制台写或打印信息。标准错误用于汇报输出不能重定向的错误。控制台应用程序可以通过调用函数GetStdHandle来获得这三个句柄。一个图形应用程序没有控制台,如果在其中调用GetStdHandle就会返回错误;如果的确要使用控制台,可以调用AllocConsole来分配一个新的控制台以使用,但当处理完成时,别忘了调用FreeConsole来释放控制台。匿名管道用得最多的功能就是重定向子进程的标准输入和标准输出。父进程可以是一个控制台或者是图形程序,而子进程必须是控制台应用程序。众所周知,控

4、制台应用使用标准输入输出句柄。若要重定向输入输出,就得用指向管道一端的句柄来替换这个标准句柄。控制台应用程序不会知道我们使用了指向管道任一端的句柄,它会把这个句柄作为标准句柄来看待。借用面向对象的术语,这就是多态性的一种。因为子进程不需作任何改动,因此这种方法是非常有用的。关于控制台应用程序应该掌握的另一点就是它从哪获得标准句柄。当一个控制台应用程序被创建时,父进程有两种选择:为子进程创建一个新的控制台或者是让子进程继承自己的控制台。若使用后者,那父进程本身必须是一个控制台应用程序,或者如果是GUI应用程序,它必须首先调用AllocConsole分配了一个控制台。

5、通过调用CreatePipe来创建一个匿名管道,它的原型为:BOOLCreatePipe(PHANDLEhReadPipe,                               PHANDLEhWritePipe,                               LPSECURITY_ATTRIBUTESlpPipeAttributes,                               DWORDnSize);·pReadPipe双字指针变量,指向管道读端的句柄。·pWritePipe双字指针变量,指向管道写端的句柄·pPipeAt

6、tributes双字指针变量,指向SECURITY_ATTRIBUTES结构,其用于决定读写句柄是否可以被子进程继承·nSize建议管道留给用户使用的缓冲区的大小,这仅仅是个建议值,可以用NULL来使用缺省值如果函数调用成功返回值为非零,否则为零。成功调用之后,就会得到两个句柄,一个指向管道的读出端,另一个指向管道的写入端。现在我将要把重点放到重定向子控制台程序的标准输出到自己进程的所需的步骤上。注意我的这个方法不同于Borland公司的API参考上的例子。Win32API参考上假设父进程是控制台应用程序,因此子进程可以继承它的标准句柄。然而大多数情况下我们需要重

7、定向控制台应用程序的输出到GUI应用程序。创建匿名管道使用CreatePipe,同时别忘了把SECURITY_ATTRIBUTES结构成员bInheritable设置为TRUE,这样才可以继承句柄。现在要准备好创建进程的函数即CreateProcess的参数,只有它才可以装载子控制台应用程序。STARTUPINFO是一个重要的结构,它决定了子进程出现时主窗口的外观,它对于我们的目标也是至关重要的。通过这个结构就可以隐藏主窗口并且把管道句柄传递给子进程。以下就是必须要填写的成员:·cbSTARTUPINFO结构的大小·dwFlags二进制标志位,它决定本结构的哪些成

8、员有效,也

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。