版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011512808/article/details/59731471
应同事需要做一个局域网时间同步的,找了下资料发现net time最方便,于新建了一个控制台项目,用CreateProcess运行cmd命令
运行了后发现时间根本就没有改变,折腾了一个晚上才发现错在字符转义上,下面的代码是错误示范
//定义一个用于产生子进程的STARTUPINFO结构体 (定义见CreateProcess,函数说明)
STARTUPINFO siStartInfo;
//定义一个用于产生子进程的PROCESS_INFORMATION结构体 (定义见CreateProcess,函数说明)
PROCESS_INFORMATION piProcInfo;
//对STARTUPINFO结构体赋值,对stdin,stdout的Handle设置为刚才得到的管道HANDLE
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; //允许设置showwindow和设置新进程的输入输出句柄参数
siStartInfo.wShowWindow = SW_HIDE;
siStartInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); //意思是:子进程的stdout输出到hStdOutWrite
siStartInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); //意思是:子进程的stderr输出到hStdErrWrite
siStartInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
TCHAR CommandLine[] = _T("/c net time \\192.168.1.1 /set /y >C:\\2.txt"); //
//ShellExecute(NULL, _T("open"), _T("C:\\Windows\\System32\\cmd.exe"), CommandLine, NULL, SW_SHOW);
// 产生子进程,具体参数说明见CreateProcess函数
BOOL bSuccess = CreateProcess(L"C:\\Windows\\System32\\cmd.exe",
CommandLine, // 子进程的命令行
NULL, // process security attributes
NULL, // primary thread security attributes
FALSE, // handles are inherited
CREATE_NO_WINDOW, // creation flags 如果想新进程显示窗口, 可以设置CREATE_NEW_CONSOLE
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
if (bSuccess)
{
TCHAR prints[MAX_PATH] = { 0 };
_stprintf_s(prints, MAX_PATH, _T("ID:%d,Process:%d\n"), piProcInfo.dwProcessId, piProcInfo.hProcess);
//MessageBox(NULL, prints, NULL, MB_SETFOREGROUND);
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
//WaitForSingleObject(piProcInfo.hProcess, INFINITE);
}
以下是正确的代码,写了这么久的代码竟然忽略了在C++两个\\表示一个\ ,
因为远程IP是用双\\表示的,在C++就要多加两个\\
结束语:
感觉CreateProcess不用设置控制台的输入输出流,也能执行成功,因为时间关系就不测试了,有兴趣的自己测试去.