匿名管道

 匿名管道

匿名管道也是进程通信的一种常用方法,请大家注意这种方法只适用与父子进程.再说一遍是父子进程.

创建匿名管道的API是:
BOOL CreatePipe(
  PHANDLE hReadPipe,                       // 读句柄指针
  PHANDLE hWritePipe,                      // 写句柄指针
  LPSECURITY_ATTRIBUTES lpPipeAttributes,  // 安全描述
  DWORD nSize                              // 管道大小
);

LPSECURITY_ATTRIBUTES结构如下:
typedef struct _SECURITY_ATTRIBUTES {
  DWORD  nLength;
  LPVOID lpSecurityDescriptor;
  BOOL   bInheritHandle; //是否可被继承 TRUE可继承,FALSE不可
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
对于安全描述结构来说,因为牵扯到父子进程,管道数据交换,必须要指定管道读写句柄可被子进程继承.

 HANDLE hWrite;
 HANDLE hRead;
 SECURITY_ATTRIBUTES sa;
 sa.bInheritHandle=TRUE;//可以被继承
 sa.lpSecurityDescriptor=NULL;
 sa.nLength=sizeof(SECURITY_ATTRIBUTES);
 if(!CreatePipe(&hRead,&hWrite,&sa,0))
 {
  MessageBox("Error On CreatePipe()");
  return;
 }

由于是父子进程,所以必须有父进程来创建一个新的子进程.相关函数如下
BOOL CreateProcess(
  LPCTSTR lpApplicationName,                 // 子进程的路径
  LPTSTR lpCommandLine,                      // 附加的命令
  LPSECURITY_ATTRIBUTES lpProcessAttributes, // 子进程的进程安全描述
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // 子进程的主线程安全描述
  BOOL bInheritHandles,                      // 可否被继承
  DWORD dwCreationFlags,                     // 创建标志
  LPVOID lpEnvironment,                      // 环境块
  LPCTSTR lpCurrentDirectory,                // 当前目录
  LPSTARTUPINFO lpStartupInfo,               // 创建信息(重要)
  LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);

重要的不多,主要参数是lpApplicationName,bInheritHandles,lpStartupInfo
lpApplicationName设置子进程的路径 "****.exe"
bInheritHandles设置为TRUE可继承
StartupInfo结构如下:
typedef struct _STARTUPINFO {
    DWORD   cb;
    LPTSTR  lpReserved;
    LPTSTR  lpDesktop;
    LPTSTR  lpTitle;
    DWORD   dwX;
    DWORD   dwY;
    DWORD   dwXSize;
    DWORD   dwYSize;
    DWORD   dwXCountChars;
    DWORD   dwYCountChars;
    DWORD   dwFillAttribute;
    DWORD   dwFlags;
    WORD    wShowWindow;
    WORD    cbReserved2;
    LPBYTE  lpReserved2;
    HANDLE  hStdInput;
    HANDLE  hStdOutput;
    HANDLE  hStdError;
} STARTUPINFO, *LPSTARTUPINFO;

额滴神啊~~~~晕了
关心以下,cb结构的大小,dwFlags创建线程的标志,hStdInput标准输入,hStdOutput标准输出,hStdError标准错误
STARTUPINFO startinfo;
startinfo.cb=sizeof(STARTUPINFO);
startinfo.dwFlags=STARTF_USESTDHANDLES;
startinfo.hStdInput=hRead;
startinfo.hStdOutput=hWrite;
startinfo.hStdError=GetStdHandle(STD_ERROR_HANDLE);//取得标准错误句柄

lpProcessInformation定义一个ProcessInformation结构对象,放入地址就OK了
PROCESS_INFORMATION pinfo;


 if(!CreateProcess("程序路径",NULL,NULL,NULL,
   TRUE,0,NULL,NULL,&startinfo,&pinfo))
 {
  CloseHandle(hRead);
  CloseHandle(hWrite);
  hRead=NULL;
  hWrite=NULL;
  MessageBox("Error On CreateProcess()");
  return;
 }
 else
 {
  CloseHandle(pi.hProcess);//关于子进程
  CloseHandle(pi.hThread);//关闭子进程主线程
 }


之后就可以用ReadFile/WriteFile进行数据读写了...

注意子进程得到管道的读写句柄可以用:
 hRead=GetStdHandle(STD_INPUT_HANDLE);
 hWrite=GetStdHandle(STD_OUTPUT_HANDLE);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值