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;
}

 

你可能感兴趣的:(win32程序执行控制台命令并重定向输出到文件)