使用CreateProcess(),它输出到文件而不是像第一个那样输出到crt [英] With CreateProcess() it output to file instead output to crt like first

查看:137
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆