`
jinghuainfo
  • 浏览: 1524063 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

控制台程序的标准句柄的重定向

 
阅读更多

控制台程序的标准句柄的重定向


一.控制台程序
尽管有很多人将控制台程序(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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics