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