匿名管道
匿名管道也是进程通信的一种常用方法,请大家注意这种方法只适用与父子进程.再说一遍是父子进程.
创建匿名管道的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);