欢迎来到天天文库
浏览记录
ID:11272727
大小:95.50 KB
页数:20页
时间:2018-07-11
《delphi与windows管道操作》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、什么是管道?参考《WIN32汇编编程》是这样描述的 Windows引入了多进程和多线程机制。同时也提供了多个进程之间的通信手段,包括剪贴板、DDE、OLE、管道等,和其他通信手段相比,管道有它自己的限制和特点,管道实际上是一段共享内存区,进程把共享消息放在那里。并通过一些API提供信息交换。管道是两个头的东西,每个头各连接一个进程或者同一个进程的不同代码,按照管道的类别分有两种管道,匿名的和命名的;按照管道的传输方向分也可以分成两种,单向的双向的。根据管道的特点,命名管道通常用在网络环境下不同计算机上运行的进程之间的通信(当然也可以用在同一台机的不同进程
2、中)它可以是单向或双向的;而匿名管道只能用在同一台计算机中,它只能是单向的。匿名管道其实是通过用给了一个指定名字的有名管道来实现的。使用管道的好处在于:读写它使用的是对文件操作的api,结果操作管道就和操作文件一样。即使你在不同的计算机之间用命名管道来通信,你也不必了解和自己去实现网络间通信的具体细节。使用匿名管道的步骤如下:使用CreatePipe建立两个管道,得到管道句柄,一个用来输入,一个用来输出准备执行控制台子进程,首先使用GetStartupInfo得到StartupInfo使用第一个管道句柄代替StartupInfo中的hStdInput,第二个
3、代替hStdOutput、hStdError,即标准输入、输出、错误句柄使用CreateProcess执行子进程,这样建立的子进程输入和输出就被定向到管道中父进程通过ReadFile读第二个管道来获得子进程的输出,通过WriteFile写第一个管道来将输入写到子进程父进程可以通过PeekNamedPipe来查询子进程有没有输出子进程结束后,要通过CloseHandle来关闭两个管道。下面是具体的说明和定义:1.建立匿名管道使用CreatePipe原形如下:BOOLCreatePipe(PHANDLEhReadPipe,//addressofvariablef
4、orreadhandlePHANDLEhWritePipe,//addressofvariableforwritehandleLPSECURITY_ATTRIBUTESlpPipeAttributes,//pointertosecurityattributesDWORDnSize//numberofbytesreservedforpipe);当管道建立后,结构中指向的hReadPipe和hWritePipe可用来读写管道,当然由于匿名管道是单向的,你只能使用其中的一个句柄,参数中的SECURITY_ATTRIBUTES的结构必须填写,定义如下:typedef
5、struct_SECURITY_ATTRIBUTES{DWORDnLength://定义以字节为单位的此结构的长度LPVOIDlpSecurityDescriptor;//指向控制这个对象共享的安全描述符,如果为NULL这个对象将被分配一个缺省的安全描述BOOLbInheritHandle;//当一个新过程被创建时,定义其返回是否是继承的.供系统API函数使用.}SECURITY_ATTRIBUTES;2.填写创建子进程用的STARTUPINFO结构,一般我们可以先用GetStartupInfo来填写一个缺省的结构,然后改动我们用得到的地方,它们是:hStd
6、Input--用其中一个管道的hWritePipe代替hStdOutput、hStdError--用另一个管道的hReadPipe代替dwFlags--设置为STARTF_USESTDHANDLESorSTARTF_USESHOWWINDOW表示输入输出句柄及wShowWindow字段有效wShowWindow--设置为SW_HIDE,这样子进程执行时不显示窗口。填写好以后,就可以用CreateProcess来执行子进程了。3.在程序中可以用PeekNamedPipe查询子进程有没有输出,原形如下:OOLPeekNamedPipe(HANDLEhNamedP
7、ipe,//handletopipetocopyfromLPVOIDlpBuffer,//pointertodatabufferDWORDnBufferSize,//size,inbytes,ofdatabufferLPDWORDlpBytesRead,//pointertonumberofbytesreadLPDWORDlpTotalBytesAvail,//pointertototalnumberofbytesavailableLPDWORDlpBytesLeftThisMessage//pointertounreadbytesinthismessage
8、);我们可以将尝试读取nBuffersize大小的数
此文档下载收益归作者所有