使用CreateProcess(),它输出到文件而不是像第一个那样输出到crt [英] With CreateProcess() it output to file instead output to crt like first
本文介绍了使用CreateProcess(),它输出到文件而不是像第一个那样输出到crt的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
嗨〜
1.从Cmd.exe模式,如果我点击了
c
b
a < br $>
^ Z
c
b
a
a
b
c
2.如果我点击排序>> test.txt
c
b
a
^ Z
3.但是如果我点击排序
c
b
a
^ Z
不输出到crt
c
b
a
a
b
c
为什么?
else if (!_tcscmp(cmdTokenList) [ 0 ],_ T( sort)))
{
if (!_ tcscmp(cmdTokenList [ 1 ] ,_T( >>)))
{
SECURITY_ATTRIBUTES fileSec = {
// sizeof(SECURITY_ATTRIBUTES),NULL,FALSE
< span class =code-ke yword> sizeof (SECURITY_ATTRIBUTES),NULL,TRUE
};
// 将句柄保存到当前STDOUT。
HANDLE hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hFile = CreateFile(
// cmdTokenList [2],GENERIC_WRITE, 0,
// cmdTokenList [2],GENERIC_WRITE,FILE_SHARE_READ,
cmdTokenList [ 2 ],GENERIC_WRITE,FILE_SHARE_WRITE,
& fileSec,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,
NULL);
// 创建不可继承的读取句柄并关闭可继承读取
// 句柄。
HANDLE hFileDup;
if (!DuplicateHandle(GetCurrentProcess(),hFile,
GetCurrentProcess(),& hFileDup, 0 ,
FALSE,
DUPLICATE_SAME_ACCESS))
ErrorExit(_T( DuplicateHandle失败));
CloseHandle(hFile);
si.hStdOutput = hFileDup;
// si.hStdOutput = hFile;
si.hStdInput = GetStdHandle( STD_INPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si.dwFlags | = STARTF_USESTDHANDLES;
// isRun = CreateProcess(NULL,cmdTokenList [0],NULL,NULL,FALSE ,0,NULL,NULL,
// & si,& pi);
isRun = CreateProcess(NULL,cmdTokenList [ 0 ],NULL,NULL,TRUE, 0 ,NULL,NULL,
& si,& pi);
// 创建流程后,恢复已保存的STDIN和STDOUT。
if (!SetStdHandle(STD_OUTPUT_HANDLE,hSaveStdout))
ErrorExit(_T( 重新定向标准输出失败\ n));
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(hFile);
}
else
{
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
// isRun = CreateProcess(NULL,cmdTokenList [0],NULL,NULL,TRUE,0,NULL ,NULL,
// & si,& pi);
isRun = CreateProcess(NULL,cmdTokenList [ 0 ],NULL,NULL,FALSE, 0 ,NULL,NULL,& si,& pi);
WaitForSingleObject(pi.hProcess,INFINITE);
}
// CloseHandle(si.hStdOutput);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// CloseHandle(si.hStdInput);
SetStdHandle(STD_OUTPUT_HANDLE,hStdout );
SetStdHandle(STD_INPUT_HANDLE,hStdin);
}
感谢阅读。
解决方案
请查看该MSDN页面上的代码示例如何重定向: http:/ /msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx [ ^ ]。
-SA
Hi~
1. From Cmd.exe mode, if I hit sort
c
b
a
^Z
c
b
a
a
b
c
2. if I hit sort >> test.txt
c
b
a
^Z
3. but then if I hit sort
c
b
a
^Z
doesn't output to crt
c
b
a
a
b
c
why?
else if( !_tcscmp(cmdTokenList[0], _T("sort")) )
{
if(!_tcscmp(cmdTokenList[1], _T(">>")) )
{
SECURITY_ATTRIBUTES fileSec = {
// sizeof(SECURITY_ATTRIBUTES), NULL, FALSE
sizeof(SECURITY_ATTRIBUTES), NULL, TRUE
};
// Save the handle to the current STDOUT.
HANDLE hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hFile = CreateFile (
// cmdTokenList[2], GENERIC_WRITE, 0,
// cmdTokenList[2], GENERIC_WRITE, FILE_SHARE_READ,
cmdTokenList[2], GENERIC_WRITE, FILE_SHARE_WRITE,
&fileSec, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
// Create noninheritable read handle and close the inheritable read
// handle.
HANDLE hFileDup;
if( !DuplicateHandle(GetCurrentProcess(), hFile,
GetCurrentProcess(), &hFileDup , 0,
FALSE,
DUPLICATE_SAME_ACCESS))
ErrorExit(_T("DuplicateHandle failed"));
CloseHandle(hFile);
si.hStdOutput = hFileDup;
// si.hStdOutput = hFile;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si.dwFlags |= STARTF_USESTDHANDLES;
// isRun = CreateProcess(NULL, cmdTokenList[0], NULL, NULL, FALSE, 0, NULL, NULL,
// &si, &pi);
isRun = CreateProcess(NULL, cmdTokenList[0], NULL, NULL, TRUE, 0, NULL, NULL,
&si, &pi);
// After process creation, restore the saved STDIN and STDOUT.
if (! SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout))
ErrorExit(_T("Re-redirecting Stdout failed\n"));
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(hFile);
}
else
{
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
// isRun = CreateProcess(NULL, cmdTokenList[0], NULL, NULL, TRUE, 0, NULL, NULL,
// &si,&pi);
isRun = CreateProcess(NULL, cmdTokenList[0], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
}
// CloseHandle(si.hStdOutput);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// CloseHandle(si.hStdInput);
SetStdHandle(STD_OUTPUT_HANDLE, hStdout);
SetStdHandle(STD_INPUT_HANDLE, hStdin);
}
thanks for reading.
解决方案
Please see how the code sample on that MSDN page redirects: http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx[^].
—SA
这篇关于使用CreateProcess(),它输出到文件而不是像第一个那样输出到crt的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文