没有合适的资源?快使用搜索试试~ 我知道了~
在VC中使用Windows管道技术编程
4星 · 超过85%的资源 需积分: 10 22 下载量 37 浏览量
2009-10-21
09:35:23
上传
评论
收藏 61KB DOC 举报
温馨提示
试读
13页
本文详细介绍了管道的相关概念,以及介绍如何在VC中使用Windows管道技术进行编程
资源推荐
资源详情
资源评论
在 VC 中使用 Windows 管道技术编程 1
2009-05-30 02:39 P.M.
不知你是否用过这样的程序,他们本身
并没有解压缩的功能,而是调用 DOS
程序 PKZIP 完成 ZIP 包的解压缩。但
是在程序运行时又没有 DOS 控制台的
窗口出现而且一切本应该在 DOS 下显
示的信息都出现在了那个安装程序的一
个文本框里。这种设计既美观又可以防
止少数眼疾手快的用户提前关了你的
DOS 窗口。
现在就来讨论一下,如何用匿名管
道技术实现这个功能。
管道技术由来已久,相信不少人对
DOS 命令里的管道技术最为熟悉。当
我们 type 一个文件的时候如果想让他
分页现实可以输入
C:\>type autoexec.bat|
more
这里“|”就是管道操作符。他以
type 输出的信息为读取端,以 more
的输入端为写入端建立的管道。
Windows 中使用较多的管道也
是匿名管道,它通过 API 函数
CreatePipe 创建。
BOOL CreatePipe(
PHANDLE hReadPipe, // 指向读端句柄的指针
PHANDLE hWritePipe, // 指向写端句柄的指针
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性结构的指针
DWORD nSize // 管道的容量
);
上面几个参数中要注意 hReadPipe,hWritePipe 是指向句柄的指针,而
不是句柄(我第一次用的时候就搞错了)。nSize 一般指定为 0,以便让系统自
己决定管道的容量。现在来看安全属性结构,SECURITY_ATTRIBUTES。
typedef struct _SECURITY_ATTRIBUTES { // sa
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
nLength 是结构体的大小,自然是用 sizeof 取得
了。lpSecurityDescriptor 是安全描述符(一个 C-Style 的字符串)。
bInheritHandle 他指出了安全描述的对象能否被新创建的进程继承。先不要
管他们的具体意义,使用的时候自然就知道了。
好,现在我们来创建一个管道
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL; 5le://使用系统默认的安全描述符
sa.bInheritHandle = TRUE; 5le://一定要为 TRUE,不然句柄不能被继承。
CreeatePipe(&hReadPipe,&hWritePipe,&sa,0);
我们的管道建好了。当然这不是最终目的,我们的目的是把 DOS 上的一
个程序输出的东西重定向到一个 Windows 程序的 Edit 控件。所以我们还需要
先启动一个 DOS 的程序,而且还不能出现 DOS 控制台的窗口(不然不就露馅
了吗)。我们用 CreateProcess 创建一个 DOS 程序的进程。
BOOL CreateProcess(
LPCTSTR lpApplicationName, // C-style 字符串:应用程序的名称
LPTSTR lpCommandLine, // C-style 字符串:执行的命令
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性
BOOL bInheritHandles, // 是否继承句柄的标志
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // C-Style 字符串:环境设置
LPCTSTR lpCurrentDirectory, // C-Style 字符串:执行目录
LPSTARTUPINFO lpStartupInfo, // 启动信息
LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);
先别走,参数是多了点,不过大部分要不不用自己填要不填个 NULL 就行
了。lpApplication 随便一点就行了。lpCommandLine 可是你要执行的命令
一定要认真写好。来,我们瞧瞧 lpProcessAttributes 和
lpThreadAttributes 怎么设置。哎?这不就是刚才那个吗。对阿,不过可比
刚才简单。由于我们只是创建一个进程,他是否能在被继承不敢兴趣所以这两
个值全为 NULL。bInHeritHandles 也是一定要设置为 TRUE 的,因为我们既
然要让新的进程能输出信息到调用他的进程里,就必须让新的进程继承调用进
程的句柄。我们对创建的新进程也没什么别的苛求,所以 dwCreationFlags
就为 NULL 了。lpEnvironment 和 lpCurrentDirectory 根据你自己的要求是
指一下就行了,一般也是 NULL。接下来的 lpStartupInfo 可是关键,我们要
认真看一下。
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
剩余12页未读,继续阅读
资源评论
- justahacker2013-04-08有点零散,但能理解
- fan_rch2013-01-143篇文章拼凑起来的,感觉不系统……
emmadream
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功