控制台程序的标准句柄的重定向
一.控制台程序
尽管有很多人将控制台程序(CONSOLE)也称为DOS程序,但是我在这里还是要将它和MS-DOS程序区分一下。首先它们俩确实有点相似:它们执行时没有图形界面。但是它们之间的区别却是根本的:
1. 控制台程序是32位的,与GUI(图形用户界面)程序一样,都为PE格式;DOS程序却是16位的,为MZ格式。
2. 在XP中运行时,控制台程序和GUI程序一样可以直接运行;而要运行DOS程序,系统先得运行ntvdm.exe,这是一个32位的V86虚拟机程序,然后再将DOS程序放在这个虚拟机中运行。
XP下cmd.exe是一个控制台程序;commond.com是一个16位DOS程序。
只有控制台程序的标准句柄是可以重定向的,也是本文要讨论的;16位DOS程序是不行的。
二.创建控制台程序时重定向标准句柄
当使用CreateProcess函数创建的子进程为控制台程序,我们可以使用STARTUPINFO结构来改变该子进程的标准句柄(standard handles):
句柄 解释
hStdInput 子进程的标准输入句柄
hStdOutput 子进程的标准输出句柄
hStdError 子进程的标准错误句柄
这三个成员由dwFlags中的STARTF_USESTDHANDLES控制。只有置上这个标志上述三个成员才有效。
我们可以将文件句柄、管道句柄或者其它任何可以通过ReadFile/WriteFile来进行同步读写的句柄设置为子进程的标准句柄。
因为在父进程中创建的句柄想在子进程中使用,所以在调用CreateProcess(bInheritHandles参数)以及CreateFile(sa. bInheritHandles参数)时必须为TRUE。
通过上面的设置,创建的子控制台程序便可以重定向标准句柄了。
三.举例
下面举一个简单的例子,将创建的控制台程序的输出指向一个文件句柄。
Procedure CreateConsoleProcess(strFileName: String);
Var
si: TSTARTUPINFO;
sa: TSECURITYATTRIBUTES;
pi: PROCESS_INFORMATION;
hFile: THANDLE;
begin
//创建文件句柄
ZeroMemory(@sa, sizeof(sa));
sa.nLength := sizeof(sa);
sa.bInheritHandle := TRUE; //一定为TRUE.
hFile := CreateFile('c:/Log.txt', GENERIC_WRITE, FILE_SHARE_READ, @sa, CREATE_ALWAYS, 0, 0);
if (hFile = INVALID_HANDLE_VALUE) then
begin
MessageBox(0, '日志文件创建失败!', '程序', MB_ICONERROR or MB_OK);
Exit;
end;
//设置STARTUPINFO结构
ZeroMemory(@si, sizeof(TSTARTUPINFO));
si.cb := sizeof(si);
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput := hFile;
si.hStdError := hFile;
si.wShowWindow := SW_HIDE;
if CreateProcess(nil, PCHAR(strFileName), nil, nil, TRUE
, 0, nil, nil, si, pi) = FALSE then
MessageBox(0, '进程创建失败!', '程序', MB_ICONERROR or MB_OK)
else
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(hFile);
end;
四.进一步阅读
1.http://blog.csdn.net/mynote/archive/2005/02/19/293369.aspx
2.http://blog.csdn.net/yangjiudan/archive/2006/04/29/697517.aspx
3.http://groups.google.com/group/comp.os.ms-windows.programmer.win32/browse_thread/thread/44decc1599b114b2
4.http://hi.baidu.com/estly/blog/item/a7495a901f938b8fa977a4b8.html
5.http://support.microsoft.com/kb/190351
6.http://www.codeproject.com/KB/cpp/9505Yamaha_1.aspx
分享到:
相关推荐
重定向是指使用重定向符号对输入或输出位置进行重新指定。
HViewer是一款专门用来进行Windows程序的句柄资源监测的软件,但不能对指定进程的句柄资源进行自动的监测,为此我写了一个HViewerSpy程序来辅助进行自动监测。使用方法是启动HViewer程序,并选择好需要进行监测的...
通过窗口名获取程序所有控件句柄,并绘制句柄结构树。
一. 背景 在Python中,文件对象sys.stdin、sys.stdout和sys.stderr...因此,IDLE将标准输出句柄替换为特殊的PseudoOutputFile对象,以便脚本输出重定向到IDLE终端窗口(Shell)。这可能导致一些奇怪的问题,例如: Py
枚举程序关联句柄,与windows资源监视器功能一样。
里面提供两个程序,一个示例程序,另一个是句柄程序,示例程序启动后,运行句柄程序,句柄程序将定时开始发送内容
上次传的一个VB2010 窗口句柄信息动态获取里面有些错误,后来想撤回的,发现已经撤不回了,这次修改后再发一次,Vb仿SPY获取和查找当前程序句柄,查找出当前支持的程序窗口句柄,并显示出窗口信息。VB2010编写的一个 ...
可以获取正常情况下无法获取的窗口句柄,某些网络游戏会有屏蔽正常获取游戏窗口句柄,用此代码可以正常
可以用来捕获其他程序上控件的小工具 帮助你来获取其他运行中的程序某个控件的句柄
VC中获取窗口句柄的各种方法
测试环境 win7+vs2013 获取并判断程序句柄,成功返回句柄。失败返回0
它还说明了使用匿名管道重定向子进程的标准输入和输出句柄的方法。 请注意,命名管道还可以用于重定向进程 i/o。 [color=var(--theme-primary-base)]CreatePipe 函数使用 [color=var(--theme-primary-base)]安全 _ ...
它还说明了使用匿名管道重定向子进程的标准输入和输出句柄的方法。 请注意,命名管道还可以用于重定向进程 i/o。[color=var(--theme-primary-base)]CreatePipe函数使用 [color=var(--theme-primary-base)]安全 _ ...
读取其他程序句柄、指定窗口的句柄
VB获取外部程序的控件句柄,根据句柄,简单实现对外程序控件的操作例程。
一款获取exe程序句柄的软件,并能显示程序内部的控件参数,相当实用的工具
查看句柄查看句柄查看句柄查看句柄查看句柄查看句柄
用来查看句柄的和用来结束句柄程序,和取句柄标题的
快速获取程序句柄,为sendmessage做前期工作,校验所获句柄正确性
查找当前置顶的程序句柄,定时关闭指定程序!