windows下进程启动另一个进程执行命令、或者执行控制台的系统命令

老代码备份。现在可能存在更好用的方式。


BOOL ExecSysCmd(LPTSTR pStrCmd, LPTSTR pStrProcName /* =NULL */, BOOL bShowWindow /* =FALSE */)
{
	BOOL BRet = FALSE;

	STARTUPINFO startupInf;
	PROCESS_INFORMATION procInf;
	
	::memset(&startupInf, 0, sizeof(STARTUPINFO) );
	startupInf.cb			= sizeof(STARTUPINFO);
	startupInf.dwFlags		|= STARTF_USESHOWWINDOW;
	if ( bShowWindow ) 
	{
		startupInf.wShowWindow	= SW_SHOW;
	}//if
	else
	{
		startupInf.wShowWindow	= SW_HIDE;
	}//else
	::memset(&procInf, 0, sizeof(PROCESS_INFORMATION) );
	if( ::CreateProcess(pStrProcName, pStrCmd, NULL, NULL, FALSE, 0, NULL, NULL, &startupInf, &procInf) == TRUE)
	{
		DWORD dwExitCode;
		::WaitForSingleObject(procInf.hProcess, INFINITE);
		if ( ::GetExitCodeProcess(procInf.hProcess,&dwExitCode) ) 
		{
			if ( dwExitCode ) 
			{
				WRITE_ERROR_LOG("系统命令[%s]执行失败", pStrCmd);
			}//if
		}//if
		else
		{
			WRITE_ERROR_LOG("获得系统命令[%s]的执行状态失败", pStrCmd);
		}//else
		::CloseHandle(procInf.hProcess);
		::CloseHandle(procInf.hThread);
		BRet = TRUE;
	}
	else
	{
		WRITE_ERROR_LOG("执行名称为[%s]的系统命令[%s]失败", pStrProcName, pStrCmd);
	}
	return BRet;
}

BOOL StartProc(PROCESS_INFORMATION & procInf,LPTSTR pStrCmd, LPTSTR pStrProcName,BOOL bShowWindow /* =FALSE */)
{
	BOOL BRet = TRUE;
	STARTUPINFO startupInf;
	::memset(&startupInf, 0, sizeof(STARTUPINFO) );
	startupInf.cb			= sizeof(STARTUPINFO);
	startupInf.dwFlags		|= STARTF_USESHOWWINDOW;
	if ( bShowWindow ) 
	{
		startupInf.wShowWindow	= SW_SHOW;
	}//if
	else
	{
		startupInf.wShowWindow	= SW_HIDE;
	}//else
	::memset(&procInf, 0, sizeof(PROCESS_INFORMATION) );
	if( ::CreateProcess(pStrProcName, pStrCmd, NULL, NULL, FALSE, 0, NULL, NULL, &startupInf, &procInf) == FALSE)
	{
		BRet = FALSE;
		WRITE_ERROR_LOG("启动名称为[%s]的进程[%s]失败", pStrProcName, pStrCmd);
	}
	return BRet;
}

使用示例:

实际停启数据库不稳定
	static void StartLocalSQLServer()
	{
		CSysCmdMgr::ExecSysCmd("NET START MSSQLSERVER");
	}
	static void StopLocalSQLServer()
	{
		CSysCmdMgr::ExecSysCmd("NET STOP MSSQLSERVER");
	}
	static void RefreshLocalSQLServer()
	{
		StopLocalSQLServer();
		StartLocalSQLServer();
	}

解压文件的示例

void CS_FileControl::UnZipAllFile(CString sFolder, CString sKey)
{
	CStringArray stackFiles;
	CS_FileControl::FindAllFolders(sFolder, stackFiles);
	CString sBatFileName = CS_FileControl::GetMainPath() + "unzip_somedata.bat";
	fstream fBat(sBatFileName, ios::out);
	int iFolderCount = stackFiles.GetSize();
	for(int i = 0; i < iFolderCount; ++i)
	{
		fBat << "\"C:\\Program Files\\WinRAR\\winrar.exe\" E -y ";
		fBat << stackFiles[i] << "\\*" << sKey << " ";
		fBat << stackFiles[i] << endl;
		fBat << "del /F " << stackFiles[i] << "\\*" << sKey << endl;
	}
	fBat.close();
	ExecSysCmd(sBatFileName.GetBuffer(0));
}

UnZipAllFile(sTemp_gdffile, ".zip");

收集同后缀的文件

/* function:FindAllFolders(const CString &sFolder,string_vector &stackFiles)
	在指定目录及其子目录下查找所有目录名
* parameter:const CString &sFolder		指定目录
			string_vector &stackFiles	目录名数组
 * copyright:linlee@kotei[2006.12.4]*/
void  FindAllFolders(const CString &sFolder,string_vector &stackFiles)
{
	CFileFind ff;
	CString sF = sFolder;
	if (sF.Right(1) != "\\")
	{
		sF += "\\";
	}
	sF += "*.*";
	BOOL res = ff.FindFile(sF);
	while(res)
	{
		res = ff.FindNextFile();
		CString gg = ff.GetFilePath();	
		if (ff.IsDirectory())
		{
			if(!ff.IsDots())
			{
				stackFiles.Add(ff.GetFilePath());
				CS_FileControl::FindAllFolders(gg, stackFiles);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43172531/article/details/103765118