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

21 篇文章 0 订阅

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


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);
			}
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值