delphi与windows管道操作

delphi与windows管道操作

ID:11272727

大小:95.50 KB

页数:20页

时间:2018-07-11

delphi与windows管道操作_第1页
delphi与windows管道操作_第2页
delphi与windows管道操作_第3页
delphi与windows管道操作_第4页
delphi与windows管道操作_第5页
资源描述:

《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大小的数

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

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

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