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\notepad.exe作為執行程序路徑。
STARTUPINFO si;
PROCESS_INFORMATION pi;
char path[MAX_PATH_LENGTH]={ "c:\windows "};
char app[MAX_PATH_LENGTH]={ "c:\windows\notepad.exe"};
char cmd[MAX_PATH_LENGTH]={ "c:\temp\test.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);
}