win32程序执行控制台命令并重定向输出到文件

ShellExecute系列函数,可以执行控制台命令,但是无法实现输出重定向。

system函数,可以执行命令,并实现输出重定向,但是无法隐藏控制台窗口。

CreateProcess函数,则既可以执行命令,又可以实现输出重定向,同时不显示控制台窗口。

但是,CreateProcess函数的使用显得有些复杂。

我们可以将他包装一下,让他变得和ShellExecute或system一样好用。

下面的函数my_exec就实现了这种包装。

通过my_exec执行命令,并实现输出重定向非常方便。

例如,执行ping命令,将结果输出到c:\haha.txt中。则按如下方式调用即可。

my_exec(TEXT("ping www.csdn.net"), TEXT("c:\\haha.txt"), -1);

再如,执行dos命令dir,并将结果输出到c:\fff.txt中。则按如下方式调用即可。

my_exec(TEXT("cmd.exe  /c  dir d:") , TEXT("c:\\fff.txt"), -1);

 

好了,函数my_exec的代码实现如下。

int my_exec(TCHAR *cmd, TCHAR *output_file, int wait_time_sec)
{
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    BOOL ret = FALSE;
    DWORD flags = CREATE_NO_WINDOW;
    HANDLE h;
   
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;      

    h = CreateFile(output_file,
        FILE_APPEND_DATA,
        FILE_SHARE_WRITE | FILE_SHARE_READ,
        &sa,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL );

 

    ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
    ZeroMemory( &si, sizeof(STARTUPINFO) );
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags |= STARTF_USESTDHANDLES;
    si.wShowWindow =SW_HIDE;
    si.hStdInput = NULL;
    si.hStdError = NULL;
    si.hStdOutput = h;


    ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);

 

    WaitForSingleObject(pi.hProcess, -1==wait_time_sec?INFINITE:wait_time_sec*1000 );

    CloseHandle(h);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return ret;
}

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值