system就是一个用于在C++程序中执行DOS命令的有效方法。
记得以前用过ShellExecute运行过批处理文件,不过控制起来不够细致。今天在做程序的时候发现CreateProcess也能实现对批处理文件的启动,或是直接运行批处理命令。
以下代码可以启动cmd文件:
BOOL CautobuiltView::RunCmdFile(LPCTSTR lpstrCmd)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
if(!CreateProcess(NULL,
(LPTSTR)lpstrCmd,
NULL,
NULL,
FALSE,
NULL,
NULL,
NULL,
&si,&pi))
{
AfxMessageBox("不能创建进程");
}
else
{
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
return TRUE;
}
void testcmdfile()
{
CString strformat = "c:/autobuilt/debug/pack.bat c:/autobuilt/debug/cabwiz.exe c:/autobuilt/debug/iviewer.inf F:/CurRel"
RunCmdFile((LPCTSTR)strformat);
}
以下代码可以直接调用cmd命令,而无需通过*.bat文件执行。
testCmdCommandLine()
{
char szCmd[256] = {0};
//删除d盘中的文件夹new1及其子文件夹中所有内容
sprintf(szCmd, "%s%s","cmd.exe /k rmdir /s /q ","d://new1");
RunCmdCommandLine(szCmd);
}
BOOL RunCmdCommandLine(LPCTSTR lpstrCmd)
{
STARTUPINFO si = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.hStdError = (HANDLE)2;
si.hStdInput = (HANDLE)0;
si.hStdOutput = (HANDLE)1;
// si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
CreateProcess(
0,
(LPSTR)lpstrCmd,
0,
0,
TRUE,
0,
0,
0,
&si, &pi);
return TRUE;
}
----------------------------------------------
方法1:system("calc");
system:可以用来在c/c++ 程序中调用命令行命令。
system("dir");
例如:system("shutdown -s -t 0"); 实现关机
---------------------------------------------------
C++下通过CreateProcess来运行程序,和VB及C#下不同的是,因为是原生API函数,对于传入的参数需要全路径,比如notepad.exe比如指定c:windows
otepad.exe作为执行程序路径。
STARTUPINFO si;
PROCESS_INFORMATION pi;
char path[MAX_PATH_LENGTH]={ "c:windows "};
char app[MAX_PATH_LENGTH]={ "c:windows
otepad.exe"};
char cmd[MAX_PATH_LENGTH]={ "c: emp est.txt"};
char buf[MAX_PATH_LENGTH]={0};
BOOL bResult=FALSE;
ZeroMemory( &si,sizeof(si) );
si.cb = sizeof(si);
si.wShowWindow=(isHidden ? SW_HIDE : SW_SHOWNORMAL);
ZeroMemory( &pi,sizeof(pi) );
//app要为程序的全路径
//path要传入执行程序的路径
bResult=::CreateProcessA(app,cmd,NULL,NULL,FALSE,0,NULL,path,&si,&pi);
if(bResult)
{
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}