关于C++运行CMD命令net time

版权声明:本文为博主原创文章,未经博主允许不得转载。 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不用设置控制台的输入输出流,也能执行成功,因为时间关系就不测试了,有兴趣的自己测试去.

猜你喜欢

转载自blog.csdn.net/u011512808/article/details/59731471
今日推荐