天天看點

在VC下執行DOS指令

/* ================================================================================================
	方法一: system("md c://12");

	1) 調用指令時會出現一個dos 視窗一閃而過,影響視覺效果。 
	2)無法将指令的執行結果回報給使用者。
*/
	system("md c://12");

/* =============================================================================================== */
/* ===============================================================================================
	方法二: WinExec("Cmd.exe /C md c://12", SW_HIDE);

	WinExec 的作用是運作指定的程式,其中第一個參數是程式的路徑及參數, 
	第二個參數是定義了以怎樣的形式啟動程式的常數值 ( 詳細請見 msdn) 。 


	比如我們要獲得目前目錄下的檔案清單,可以這樣 

	WinExec("cmd.exe /c dir > result.txt", SW_HIDE); 

	執行這行代碼後,将會在目前目錄下生成一個 result.txt 的檔案,檔案的内容就是執行 dir 指令的輸出 ( 注 2) 。
	并且不會出現 dos 視窗 (SW_HIDE 代表隐藏視窗 ) 


	有時候我們需要同時執行數條語句,是不是要執行多次 system 調用呢? 
	答案是否定的, dos 自身提供了執行多條指令的功能,符号 && 代表同時執行多條指令。 
	如“ cd C:/demo && dir ”會首先将目錄切換到 C:/demo 檔案夾,然後執行 dir 指令。 

	利用 && 指令可以實作這樣的功能:暫停等待使用者按下任意鍵,接下來執行某個指令。 
	如: pause && dir 會在螢幕上顯示“請按任意鍵繼續”和,在使用者按下任意鍵後會 執行 dir 指令輸出檔案清單。 


	上面利用 pause 指令實作暫停,但有個副作用:如果使用者不按下鍵盤,程式就會永遠停在那裡。 
	是以我們可以換個指令以實作暫停某段時間後繼續。 pause 指令是不接受參數的,我們要換另一個指令: ping 。
	可以大家以前也用過 ping ,不過一般是用來探測網絡資訊的吧?這裡用它來實作暫停某段時間: 
	“ ping -w 3000 w > nul ”暫停三秒後繼續 ( 注 3) 
 ===============================================================================================  */
注 1:
UINT WinExec( 			 
  LPCSTR lpCmdLine, 
  UINT uCmdShow 
  ); 
/* ===============================================================================================  */


/* ===============================================================================================
	方法三: ShellExecute

	ShellExecute(NULL,"open","d://WINDOWS//system32//cmd.exe","/c md d://zzz","",SW_SHOW);

	WinExec主要運作EXE檔案。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);  
	ShellExecute不僅可以運作EXE檔案,也可以運作已經關聯的檔案。 
	首先必須引用shellapi.pas單元:uses ShellAPI;  

	1.标準用法   
	  ShellExecute函數原型及參數含義如下:  
	  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;  
	  ●hWnd:用于指定父視窗句柄。當函數調用過程出現錯誤時,它将作為Windows消息視窗的父視窗。例如,可以将其設定為應用程式主視窗句柄,
				即 Application.Handle,也可以将其設定為桌面視窗句柄(用GetDesktopWindow函數獲得)。  
	  ●Operation:用于指定要進行的操作。其中“open”操作表示執行由FileName參數指定的程式,或打開由FileName參數指定的檔案或檔案夾;
				“print”操作表示列印由FileName參數指定的檔案;“explore”操作表示浏覽由FileName參數指定的檔案夾。當參數設為nil時,
				表示執行預設操作“open”。  
	  ●FileName:用于指定要打開的檔案名、要執行的程式檔案名或要浏覽的檔案夾名。  
	  ●Parameters:若FileName參數是一個可執行程式,則此參數指定指令行參數,否則此參數應為nil或PChar(0)。  
	  ●Directory:用于指定預設目錄。  
	  ●ShowCmd:若FileName參數是一個可執行程式,則此參數指定程式視窗的初始顯示方式,否則此參數應設定為0。  
	  若ShellExecute函數調用成功,則傳回值為被執行程式的執行個體句柄。若傳回值小于32,則表示出現錯誤。  
	  上述僅僅是ShellExecute函數的标準用法,下面将介紹它的特殊用法。  

	2.特殊用法   
	  如果将FileName參數設定為“http:”協定格式,那麼該函數将打開預設浏覽器并連結到指定的URL位址。若使用者機器中安裝了多個浏覽器,
			則該函數将根據Windows 9x/NT系統資料庫中http協定處理程式(Protocols Handler)的設定确定啟動哪個浏覽器。  
	  格式一:http://網站域名。  
	 	如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn’ , nil, nil, SW_SHOWNORMAL);  
	  格式二:http://網站域名/網頁檔案名。  
	  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn/default.htm’,nil,nil ,       SW_SHOWNORMAL);  
	  如果将FileName參數設定為“mailto:”協定格式,那麼該函數将啟動預設郵件客戶程式,如Microsoft Outlook(也包括Microsoft Outlook Express)
			或Netscape Messanger。若使用者機器中安裝了多個郵件客戶程式,則該函數将根據Windows 9x/NT系統資料庫中mailto協定處理程式的設定确定啟動哪個
			郵件客戶程式。  
	  格式一:mailto:  
	  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開新郵件視窗。  
	  格式二:mailto:使用者賬号@郵件伺服器位址  
	  如:ShellExecute(handle, ‘open’,‘ mailto:[email protected]’, nil, nil, SW_SHOWNORMAL);打開新郵件視窗,并自動填入收件人位址。
		若指定多個收件人位址,則收件人位址之間必須用分号或逗号分隔開(下同)如:ShellExecute(this->m_hWnd,"open","mailto:[email protected]","","",SW_SHOW);
			這個可以激活Outlook Express。 
		格式三:mailto:使用者賬号@郵件伺服器位址?subject=郵件主題&body=郵件正文  
		如:ShellExecute(handle, ‘open’, ‘ mailto:[email protected]?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);
			打開新郵件視窗,并自動填入收件人位址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字元%0a。

   ===============================================================================================  */

//	例子(delphi):  
//	在一個應用程式調用c:Project1.exe;  
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串内容’,nil, SW_SHOWNORMAL);  
//	在Project1.exe裡可以調用:  
procedure TForm1.FormCreate(Sender: TObject);  
var i:integer;  
begin  
for i:=1 to paramcount do  
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));  
end; 

/* ===============================================================================================
最後的那個參數,為視窗指定可視性方面的一個指令。  
請用下述任何一個常數  
SW_HIDE 隐藏視窗,活動狀态給令一個視窗  
SW_MINIMIZE 最小化視窗,活動狀态給令一個視窗  
SW_RESTORE 用原來的大小和位置顯示一個視窗,同時令其進入活動狀态  
SW_SHOW 用目前的大小和位置顯示一個視窗,同時令其進入活動狀态  
SW_SHOWMAXIMIZED 最大化視窗,并将其激活  
SW_SHOWMINIMIZED 最小化視窗,并将其激活  
SW_SHOWMINNOACTIVE 最小化一個視窗,同時不改變活動視窗  
SW_SHOWNA 用目前的大小和位置顯示一個視窗,不改變活動視窗  
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個視窗,同時不改變活動視窗  
SW_SHOWNORMAL 與SW_RESTORE相同

	=============================================================================================== */


/* ===============================================================================================
深入淺出ShellExecute     
譯者:徐景周(原作:Nishant       S)   

Q:       如何打開一個應用程式?       ShellExecute(this->m_hWnd,"open","calc.exe","","",       SW_SHOW       );   
或       ShellExecute(this->m_hWnd,"open","notepad.exe",   
					 "c://MyLog.log","",SW_SHOW       );   
正如您所看到的,我并沒有傳遞程式的完整路徑。   
Q:       如何打開一個同系統程式相關連的文檔?       ShellExecute(this->m_hWnd,"open",   
		 "c://abc.txt","","",SW_SHOW       );   
Q:       如何打開一個網頁?       ShellExecute(this->m_hWnd,"open",   
			 "http://www.google.com","","",       SW_SHOW       );   
Q:       如何激活相關程式,發送EMAIL?       ShellExecute(this->m_hWnd,"open",   
			 "mailto:[email protected]","","",       SW_SHOW       );   
Q:       如何用系統列印機列印文檔?       ShellExecute(this->m_hWnd,"print",   
			 "c://abc.txt","","",       SW_HIDE);   
Q:       如何用系統查找功能來查找指定檔案?       ShellExecute(m_hWnd,"find","d://nish",   
			 NULL,NULL,SW_SHOW);   
Q:       如何啟動一個程式,直到它運作結束?       SHELLEXECUTEINFO       ShExecInfo       =       {0};   
		 ShExecInfo.cbSize       =       sizeof(SHELLEXECUTEINFO);   
		 ShExecInfo.fMask       =       SEE_MASK_NOCLOSEPROCESS;   
		 ShExecInfo.hwnd       =       NULL;   
		 ShExecInfo.lpVerb       =       NULL;   
		 ShExecInfo.lpFile       =       "c://MyProgram.exe";   
		 ShExecInfo.lpParameters       =       "";   
		 ShExecInfo.lpDirectory       =       NULL;   
		 ShExecInfo.nShow       =       SW_SHOW;   
		 ShExecInfo.hInstApp       =       NULL;   
		 ShellExecuteEx(&ShExecInfo);   
		 WaitForSingleObject(ShExecInfo.hProcess,INFINITE);   
		 或:       PROCESS_INFORMATION       ProcessInfo;     
		 STARTUPINFO       StartupInfo;       //This       is       an       [in]       parameter   
		 ZeroMemory(&StartupInfo,       sizeof(StartupInfo));   
		 StartupInfo.cb       =       sizeof       StartupInfo       ;       //Only       compulsory       field   
		 if(CreateProcess("c://winnt//notepad.exe",       NULL,     
			 NULL,NULL,FALSE,0,NULL,   
			 NULL,&StartupInfo,&ProcessInfo))   
		 {     
			 WaitForSingleObject(ProcessInfo.hProcess,INFINITE);   
			 CloseHandle(ProcessInfo.hThread);   
			 CloseHandle(ProcessInfo.hProcess);   
		 }       
		 else   
		 {   
			 MessageBox("The       process       could       not       be       started...");   
		 }   
		 
Q:       如何顯示檔案或檔案夾的屬性?       SHELLEXECUTEINFO       ShExecInfo       ={0};   
		 ShExecInfo.cbSize       =       sizeof(SHELLEXECUTEINFO);   
		 ShExecInfo.fMask       =       SEE_MASK_INVOKEIDLIST       ;   
		 ShExecInfo.hwnd       =       NULL;   
		 ShExecInfo.lpVerb       =       "properties";   
		 ShExecInfo.lpFile       =       "c://";       //can       be       a       file       as       well   
		 ShExecInfo.lpParameters       =       "";     
		 ShExecInfo.lpDirectory       =       NULL;   
		 ShExecInfo.nShow       =       SW_SHOW;   
		 ShExecInfo.hInstApp       =       NULL;     
		 ShellExecuteEx(&ShExecInfo);   

  =============================================================================================== */
		 
/* ===============================================================================================		 
		 附:一些windows的系統指令:
			 
			 winver---------檢查Windows版本 
			 wmimgmt.msc----打開windows管理體系結構(WMI) 
			 wupdmgr--------windows更新程式 
			 wscript--------windows腳本宿主設定 
			 write----------寫字闆 
			 winmsd---------系統資訊 
			 wiaacmgr-------掃描器和照相機向導 
			 winchat--------XP自帶區域網路聊天 
			 
			 mem.exe--------顯示記憶體使用情況 
			 Msconfig.exe---系統配置實用程式 
			 mplayer2-------簡易widnows media player 
			 mspaint--------畫圖闆 
			 mstsc----------遠端桌面連接配接 
			 mplayer2-------媒體播放機 
			 magnify--------放大鏡實用程式 
			 mmc------------打開控制台 
			 mobsync--------同步指令 
			 
			 dxdiag---------檢查DirectX資訊 
			 drwtsn32------ 系統醫生 
			 devmgmt.msc--- 裝置管理器 
			 dfrg.msc-------磁盤碎片整理程式 
			 diskmgmt.msc---磁盤管理實用程式 
			 dcomcnfg-------打開系統元件服務 
			 ddeshare-------打開DDE共享設定 
			 dvdplay--------DVD播放器 
			 
			 net stop messenger-----停止信差服務 
			 net start messenger----開始信差服務 
			 notepad--------打開記事本 
			 nslookup-------網絡管理的工具向導 
			 ntbackup-------系統備份和還原 
			 narrator-------螢幕“講述人” 
			 ntmsmgr.msc----移動存儲管理器 
			 ntmsoprq.msc---移動存儲管理者*作請求 
			 netstat -an----(TC)指令檢查接口 
			 
			 syncapp--------建立一個公文包 
			 sysedit--------系統配置編輯器 
			 sigverif-------檔案簽名驗證程式 
			 sndrec32-------錄音機 
			 shrpubw--------建立共享檔案夾 
			 secpol.msc-----本地安全政策 
			 syskey---------系統加密,一旦加密就不能解開,保護windows xp系統的雙重密碼 
			 services.msc---本地服務設定 
			 Sndvol32-------音量控制程式 
			 sfc.exe--------系統檔案檢查器 
			 sfc /scannow---windows檔案保護 
			 
			 tsshutdn-------60秒倒計時關機指令 
			 tourstart------xp簡介(安裝完成後出現的漫遊xp程式) 
			 taskmgr--------任務管理器 
			 
			 eventvwr-------事件檢視器 
			 eudcedit-------造字程式 
			 explorer-------打開資料總管 
			 
			 packager-------對象包裝程式 
			 perfmon.msc----計算機性能監測程式 
			 progman--------程式管理器 
			 
			 regedit.exe----系統資料庫 
			 rsop.msc-------組政策結果集 
			 regedt32-------系統資料庫編輯器 
			 rononce -p ----15秒關機 
			 regsvr32 /u *.dll----停止dll檔案運作 
			 regsvr32 /u zipfldr.dll------取消ZIP支援 
			 
			 cmd.exe--------CMD指令提示符 
			 chkdsk.exe-----Chkdsk磁盤檢查 
			 certmgr.msc----證書管理實用程式 
			 calc-----------啟動電腦 
			 charmap--------啟動字元映射表 
			 cliconfg-------SQL SERVER 用戶端網絡實用程式 
			 Clipbrd--------剪貼闆檢視器 
			 conf-----------啟動netmeeting 
			 compmgmt.msc---計算機管理 
			 cleanmgr-------好東西整理 
			 ciadv.msc------索引服務程式 
			 
			 osk------------打開螢幕鍵盤 
			 odbcad32-------ODBC資料源管理器 
			 oobe/msoobe /a----檢查XP是否激活 
			 lusrmgr.msc----本機使用者群組 
			 logoff---------登出指令 
			 
			 iexpress-------木馬捆綁工具,系統自帶 
			 
			 Nslookup-------IP位址偵測器 
			 
			 fsmgmt.msc-----共享檔案夾管理器 
			 
			 utilman--------輔助工具管理器 
			 
			 gpedit.msc-----組政策 
			 xp下運作指令大全. 
			 
			 $Systemroot$Documents and Settingsusername 目錄下 
			 
			 appwiz.cpl------------添加删除程式 
			 
			 control userpasswords2--------使用者帳戶設定 
			 
			 cleanmgr-------垃圾整理 
			 
			 CMD--------------指令提示符可以當作是 Windows 的一個附件,Ping,Convert 這些不能在圖形環境下 使用的功能要借助它來完成。 
			 
			 cmd------jview察看Java虛拟機版本。 
			 
			 command.com------調用的則是系統内置的 NTVDM,一個 DOS虛拟機。它完全是一個類似 Virtual PC 的 虛拟環境,和系統本身聯系不大。當我們在指令提示符下運作 DOS 程式時,實際上也 是自動轉移到 NTVDM虛拟機下,和 CMD 本身沒什麼關系。 
			 
			 calc-----------啟動電腦 
			 
			 chkdsk.exe-----Chkdsk磁盤檢查 
			 
			 compmgmt.msc---計算機管理 
			 
			 conf-----------啟動 netmeeting 
			 
			 control userpasswords2-----User Account 權限設定 
			 
			 devmgmt.msc--- 裝置管理器 
			 
			 diskmgmt.msc---磁盤管理實用程式 
			 
			 dfrg.msc-------磁盤碎片整理程式 
			 
			 drwtsn32------ 系統醫生 
			 
			 dvdplay--------啟動Media Player 
			 
			 dxdiag-----------DirectX Diagnostic Tool 
			 
			 gpedit.msc-------組政策編輯器 
			 
			 gpupdate /target:computer /force 強制重新整理組政策 
			 
			 eventvwr.exe-----事件檢視器 
			 
			 explorer-------打開資料總管 
			 
			 logoff---------登出指令 
			 
			 lusrmgr.msc----本機使用者群組 
			 
			 msinfo32---------系統資訊 
			 
			 msconfig---------系統配置實用程式 
			 
			 net start (servicename)----啟動該服務 
			 
			 net stop (servicename)-----停止該服務 
			 
			 notepad--------打開記事本 
			 
			 nusrmgr.cpl-------同control userpasswords,打開使用者帳戶控制台 
			 
			 Nslookup-------IP位址偵測器 
			 
			 oobe/msoobe /a----檢查XP是否激活 
			 
			 perfmon.msc----計算機性能監測程式 
			 
			 progman--------程式管理器 
			 
			 regedit----------系統資料庫編輯器 
			 
			 regedt32-------系統資料庫編輯器 
			 
			 regsvr32 /u *.dll----停止dll檔案運作 
			 
			 route print------檢視路由表 
			 
			 rononce -p ----15秒關機 
			 
			 rsop.msc-------組政策結果集 
			 
			 rundll32.exe rundll32.exe %Systemroot%System32shimgvw.dll,ImageView_Fullscreen----啟動一個空白的Windows 圖檔和傳真檢視器 
			 
			 secpol.msc--------本地安全政策 
			 
			 services.msc---本地服務設定 
			 
			 sfc /scannow-----啟動系統檔案檢查器 
			 
			 sndrec32-------錄音機 
			 
			 taskmgr-----任務管理器(适用于2000/xp/2003) 
			 
			 tsshutdn-------60秒倒計時關機指令 
			 
			 winchat--------XP自帶區域網路聊天 
			 
			 winmsd---------系統資訊 
			 
			 winver-----顯示About Windows 視窗
			 
			 
			 
			 Windows XP的關機是由Shutdown.exe程式來控制的,位于Windows/System32檔案夾中。如果想讓Windows 2000也實作同樣的效果,可以把Shutdown.exe複制到系統目錄下。 
			 
			 比如你的電腦要在22:00關機,可以選擇“開始→運作”,輸入“at 22:00 Shutdown -s”, 這樣,到了22點電腦就會出現“系統關機”對話框,預設有30秒鐘的倒計時并提示你儲存工作。如果你想以倒計時的方式關機,可以輸入 “Shutdown.exe -s -t 3600”,這裡表示60 分鐘後自動關機,“3600”代表60分鐘。 
			 
			 設定好自動關機後,如果想取消的話,可以在運作中輸入“shutdown -a”。另外輸入“shutdown -i”,則可以打開設定自動關機對話框,對自動關機進行設定。 
			 
			 Shutdown.exe的參數,每個都具有特定的用途,執行每一個都會産生不同的效果,比如 “-s”就表示關閉本地計算機,“-a”表示取消關機操作,下面列出了更多參數, 可以在Shutdown.exe中按需使用。 
			 
			 -f:強行關閉應用程式 
			 
			 -m //計算機名:控制遠端計算機 
			 
			 -i:顯示圖形使用者界面,但必須是Shutdown的第一個選項 
			 
			 -l:登出目前使用者 
			 
			 -r:關機并重新開機 
			 
			 -t 時間:設定關機倒計時 
			 
			 -c "消息内容":輸入關機對話框中的消息内容(不能超127個字元) 
			 
			 有時候,我們需要定時關閉計算機,下面介紹一個在Windows XP下實作定時關機的簡單方法。 
			 
			 指定系統在22分鐘後自動關閉:點選“開始→運作”,在“打開”中輸入指令“Shutdown -s -t 1320”(注意:引号不輸入,參數之間有空格,1320的機關是秒),單擊“确定” 
			 按鈕即可。 
			 
			 指定系統在某個時間(比如12:00)自動關閉:在“打開”中輸入指令 
			 “at 12:00 Shutdown -s”即可。 
			 
			 取消定時關機:在“打開”中輸入指令“Shutdown -a”即可。

	=============================================================================================== */

/*
	方法四: CreateProcess
			 
	下面這個示例的函數可以把給定的DOS指令執行一遍,并把DOS下的輸出内容記錄在buffer中。同時示範了匿名管道重定向輸出的用法:
			 
			 -------------------------------------------------------------------------------------*/
#define EXECDOSCMD "dir c:" //可以換成你的指令
			 
BOOL CDOSDlg::ExecDosCmd()
{
	SECURITY_ATTRIBUTES sa;
	HANDLE hRead,hWrite;
	
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;
	
	if (!CreatePipe(&hRead,&hWrite,&sa,0))
	{
		return FALSE;	
	}
	
	char command[1024]; //長達1K的指令行,夠用了吧
	
	strcpy(command,"Cmd.exe /C ");
	strcat(command,EXECDOSCMD);
	
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	
	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);
	
	si.hStdError = hWrite; //把建立程序的标準錯誤輸出重定向到管道輸入
	si.hStdOutput = hWrite; //把建立程序的标準輸出重定向到管道輸入
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
	
	//關鍵步驟,CreateProcess函數參數意義請查閱MSDN
	if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))	
	{	
		CloseHandle(hWrite);	
		CloseHandle(hRead);	
		return FALSE;	
	}
	CloseHandle(hWrite);
	
	char buffer[4096] = {0}; //用4K的空間來存儲輸出的内容,隻要不是顯示檔案内容,一般情況下是夠用了。
	DWORD bytesRead;
	
	while (true)	
	{	
		if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)	
			break;
		
		//buffer中就是執行的結果,可以儲存到文本,也可以直接輸出	
		AfxMessageBox(buffer); //這裡是彈出對話框顯示	
	}
	
	CloseHandle(hRead);
	return TRUE;
}
			 
           

轉載自: http://blog.csdn.net/jkkjklmn/article/details/6161161

繼續閱讀