e语言之匿名管道的应用经验
1、使用到的API函数:CreatePipeCloseHandle创建匿名管道关闭句柄,在后面可以用于关闭多余的管道CreateProcessA创建一个新的进程,可以设置读写管道PeekName颊俄岿髭dPipe查看管道中的数据ReadFile读文件,该命令可以用于读取管道中的数据相应源代码:.版本 2.DLL命令 CreatePipe, 整数型, , "CreatePipe" .参数 phReadPipe, 整数型, 传址 .参数 phWritePipe, 整数型, 传址 .参数 lpPipeAttributes, SECURITY_ATTRIBUTES, 传址 .参数 nSize, 整数型.DLL命令 CreateProcessA, 整数型 .参数 lpApplicationName, 整数型, , 要执行的应用程序的名字 .参数 lpCommandLine, 文本型, , 要执行的命令行 .参数 lpProcessAttributes, 整数型, , SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值表示采用不允许继承的默认描述符 .参数 lpThreadAttributes, 整数型, , SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值表示采用不允许继承的默认描述符。 .参数 bInheritHandles, 逻辑型, , TRUE表示允许当前进程中的所有句柄都由新建的子进程继承 .参数 dwCreationFlags, 整数型 .参数 lpEnvironment, 整数型, , 任何类型,指向一个环境块的指针 .参数 lpCurrentDriectory, 整数型, , 新进程的当前目录路径 .参数 lpStartupInfo, STARTUPINFO, 传址, STARTUPINFO,指定一个STARTUPINFO结构,其中包含了创建进程时使用的附加信息 .参数 lpProcessInformation, PROCESS_INFORMATION, 传址, PROCESS_INFORMATION,该结构用于容纳新进程的进程和线程标识。.DLL命令 CloseHandle, 整数型, "kernel32", "CloseHandle" .参数 句柄, 整数型.DLL命令 PeekNamedPipe, 整数型, , "PeekNamedPipe" .参数 hNamedPipe, 整数型 .参数 lpBuffer, 整数型 .参数 nBufferSize, 整数型 .参数 lpBytesRead, 整数型 .参数 lpTotalBytesAvail, 整数型, 传址 .参数 lpBytesLeftThisMessage, 整数型.DLL命令 ReadFile, 整数型, , "ReadFile" .参数 hFile, 整数型 .参数 lpBuffer, 字节集, 传址 .参数 nNumberOfBytesToRead, 整数型 .参数 lpNumberOfBytesRead, 整数型, 传址 .参数 lpOverlapped, 整数型.DLL命令 GetExitCodeProcess, 整数型, , "GetExitCodeProcess", , 非零表示成功,零表示失败。 .参数 hProcess, 整数型, , 用于装载进程退出代码的一个长整数变量。 .参数 lpExitCode, 整数型, 传址, 想获取退出代码的一个进程的句柄

3、实现基本思路首先,定义一个整型变量hWriteSECURITY_ATTRIBUTES.nLength=12SECURITY_ATTRIBUTES.lpSecurityDescriptor=0SECURITY_ATTRIBUTES.bInheritHandle=1这里创建管道STARTUPINFO.cb=68STARTUPINFO.dwFlags=257STARTUPINFO.wShowWindow=0STARTUPINFO.hStdOutput=hWriteSTARTUPINFO.hStdError=hWrite这里创建出一个新进程,然后用closehandle关闭多余句柄

5、代码说明:①怎样创建管道:例如:CreateProcessA(0, “ cmd.exe /c ” + 一个 dos 命令 , 0, 0, 真 , 0, 0, 0, STARTUPINFO,PROCESS_INFORMATION)‘然后就用 CloseHandle 关闭多余句柄CoseHandle(hWrite)'刚才定义的变量,此时是多余的句柄,关闭它!②怎样读取出管道中的数据?step 1:PeekNamedPipe 该函数看看管道中是否有数据e.g: PeekNamedPipe (读取句柄, 0, 0, 0, 长度, 0)'两个变量:读取句柄 和 长度step 2:当管道中有数据时(此处可以加一个判断语句,当 长度(上面的变量) <>0数据时开始读取e.g: 定义几个变量 :文本(字节集 型),文本=取空白字节集(1024)'推荐使用1024这个值 1024b=1kbReadFile(读取句柄,文本,1023,长度,0)好了 得到文本: 到文本(文本)
