a. system("md c://12");
1) 調用命令時(shí)會(huì )出現一個(gè)dos窗口一閃而過(guò),影響視覺(jué)效果。
2 )無(wú)法將命令的執行結果反饋給用戶(hù)。
b. WinExec("Cmd.exe /C md c://12", SW_HIDE);
WinExec的作用是運行指定的程序,其中第一個(gè)參數是程序的路徑及參數,第二個(gè)參數是定義了以怎樣的形式啟動(dòng)程序的常數值(詳細請見(jiàn)msdn)。
比如我們要獲得當前目錄下的文件列表,可以這樣
WinExec("cmd.exe /c dir > result.txt", SW_HIDE);
執行這行代碼后,將會(huì )在當前目錄下生成一個(gè)result.txt的文件,文件的內容就是執行dir命令的輸出(注2)。并且不會(huì )出現dos窗口(SW_HIDE代表隱藏窗口)
有時(shí)候我們需要同時(shí)執行數條語(yǔ)句,是不是要執行多次system調用呢?
答案是否定的,dos自身提供了執行多條命令的功能,符號&&代表同時(shí)執行多條命令。
如“cd C:/demo && dir”會(huì )首先將目錄切換到 C:/demo文件夾,然后執行dir命令。
利用&&命令可以實(shí)現這樣的功能:暫停等待用戶(hù)按下任意鍵,接下來(lái)執行某個(gè)命令。
如:pause && dir 會(huì )在屏幕上顯示“請按任意鍵繼續”和,在用戶(hù)按下任意鍵后會(huì )執行dir命令輸出文件列表。
上面利用pause命令實(shí)現暫停,但有個(gè)副作用:如果用戶(hù)不按下鍵盤(pán),程序就會(huì )永遠停在那里。所以我們可以換個(gè)命令以實(shí)現暫停某段時(shí)間后繼續。pause命令是不接受參數的,我們要換另一個(gè)命令:ping??梢源蠹乙郧耙灿眠^(guò)ping,不過(guò)一般是用來(lái)探測網(wǎng)絡(luò )信息的吧?這里用它來(lái)實(shí)現暫停某段時(shí)間:
“ping -w 3000 w > nul”暫停三秒后繼續(注3)
注1:
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);
c. 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文件,也可以運行已經(jīng)關(guān)聯(lián)的文件。
首先必須引用shellapi.pas單元:uses ShellAPI;
1.標準用法
ShellExecute函數原型及參數含義如下:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
●hWnd:用于指定父窗口句柄。當函數調用過(guò)程出現錯誤時(shí),它將作為Windows消息窗口的父窗口。例如,可以將其設置為應用程序主窗口句柄,即Application.Handle,也可以將其設置為桌面窗口句柄(用GetDesktopWindow函數獲得)。
●Operation:用于指定要進(jìn)行的操作。其中“open”操作表示執行由FileName參數指定的程序,或打開(kāi)由FileName參數指定的文件或文件夾;“print”操作表示打印由FileName參數指定的文件;“explore”操作表示瀏覽由FileName參數指定的文件夾。當參數設為nil時(shí),表示執行默認操作“open”。
●FileName:用于指定要打開(kāi)的文件名、要執行的程序文件名或要瀏覽的文件夾名。
●Parameters:若FileName參數是一個(gè)可執行程序,則此參數指定命令行參數,否則此參數應為nil或PChar(0)。
●Directory:用于指定默認目錄。
●ShowCmd:若FileName參數是一個(gè)可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置為0。
若ShellExecute函數調用成功,則返回值為被執行程序的實(shí)例句柄。若返回值小于32,則表示出現錯誤。
上述僅僅是ShellExecute函數的標準用法,下面將介紹它的特殊用法。
2.特殊用法
如果將FileName參數設置為“http:”協(xié)議格式,那么該函數將打開(kāi)默認瀏覽器并鏈接到指定的URL地址。若用戶(hù)機器中安裝了多個(gè)瀏覽器,則該函數將根據Windows 9x/NT注冊表中http協(xié)議處理程序(Protocols Handler)的設置確定啟動(dòng)哪個(gè)瀏覽器。
格式一:http://網(wǎng)站域名。
如:ShellExecute(handle, ‘open’, http:// ; www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);
格式二:http://網(wǎng)站域名/網(wǎng)頁(yè)文件名。
如:ShellExecute(handle, ‘open’, http:// ; www.neu.edu.cn/default.htm’,nil,nil, SW_SHOWNORMAL);
如果將FileName參數設置為“mailto:”協(xié)議格式,那么該函數將啟動(dòng)默認郵件客戶(hù)程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶(hù)機器中安裝了多個(gè)郵件客戶(hù)程序,則該函數將根據Windows 9x/NT注冊表中mailto協(xié)議處理程序的設置確定啟動(dòng)哪個(gè)郵件客戶(hù)程序。
格式一:mailto:
如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開(kāi)新郵件窗口。
格式二:mailto:用戶(hù)賬號@郵件服務(wù)器地址
如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打開(kāi)新郵件窗口,并自動(dòng)填入收件人地址。若指定多個(gè)收件人地址,則收件人地址之間必須用分號或逗號分隔開(kāi)(下同)如:ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );這個(gè)可以激活Outlook Express。
格式三:mailto:用戶(hù)賬號@郵件服務(wù)器地址?subject=郵件主題&body=郵件正文
如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開(kāi)新郵件窗口,并自動(dòng)填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字符%0a。
例子(delphi):
在一個(gè)應用程序調用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;
最后的那個(gè)參數,為窗口指定可視性方面的一個(gè)命令。
請用下述任何一個(gè)常數
SW_HIDE 隱藏窗口,活動(dòng)狀態(tài)給令一個(gè)窗口
SW_MINIMIZE 最小化窗口,活動(dòng)狀態(tài)給令一個(gè)窗口
SW_RESTORE 用原來(lái)的大小和位置顯示一個(gè)窗口,同時(shí)令其進(jìn)入活動(dòng)狀態(tài)
SW_SHOW 用當前的大小和位置顯示一個(gè)窗口,同時(shí)令其進(jìn)入活動(dòng)狀態(tài)
SW_SHOWMAXIMIZED 最大化窗口,并將其激活
SW_SHOWMINIMIZED 最小化窗口,并將其激活
SW_SHOWMINNOACTIVE 最小化一個(gè)窗口,同時(shí)不改變活動(dòng)窗口
SW_SHOWNA 用當前的大小和位置顯示一個(gè)窗口,不改變活動(dòng)窗口
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個(gè)窗口,同時(shí)不改變活動(dòng)窗口
SW_SHOWNORMAL 與SW_RESTORE相同
深入淺出ShellExecute
譯者:徐景周(原作:Nishant S)
Q: 如何打開(kāi)一個(gè)應用程序? ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或 ShellExecute(this->m_hWnd,"open","notepad.exe",
"c://MyLog.log","",SW_SHOW );
正如您所看到的,我并沒(méi)有傳遞程序的完整路徑。
Q: 如何打開(kāi)一個(gè)同系統程序相關(guān)連的文檔? ShellExecute(this->m_hWnd,"open",
"c://abc.txt","","",SW_SHOW );
Q: 如何打開(kāi)一個(gè)網(wǎng)頁(yè)? ShellExecute(this->m_hWnd,"open",
"http://www.google.com","","", SW_SHOW );
Q: 如何激活相關(guān)程序,發(fā)送EMAIL? ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );
Q: 如何用系統打印機打印文檔? ShellExecute(this->m_hWnd,"print",
"c://abc.txt","","", SW_HIDE);
Q: 如何用系統查找功能來(lái)查找指定文件? ShellExecute(m_hWnd,"find","d://nish",
NULL,NULL,SW_SHOW);
Q: 如何啟動(dòng)一個(gè)程序,直到它運行結束? 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----打開(kāi)windows管理體系結構(WMI)
wupdmgr--------windows更新程序
wscript--------windows腳本宿主設置
write----------寫(xiě)字板
winmsd---------系統信息
wiaacmgr-------掃描儀和照相機向導
winchat--------XP自帶局域網(wǎng)聊天
mem.exe--------顯示內存使用情況
Msconfig.exe---系統配置實(shí)用程序
mplayer2-------簡(jiǎn)易widnows media player
mspaint--------畫(huà)圖板
mstsc----------遠程桌面連接
mplayer2-------媒體播放機
magnify--------放大鏡實(shí)用程序
mmc------------打開(kāi)控制臺
mobsync--------同步命令
dxdiag---------檢查DirectX信息
drwtsn32------ 系統醫生
devmgmt.msc--- 設備管理器
dfrg.msc-------磁盤(pán)碎片整理程序
diskmgmt.msc---磁盤(pán)管理實(shí)用程序
dcomcnfg-------打開(kāi)系統組件服務(wù)
ddeshare-------打開(kāi)DDE共享設置
dvdplay--------DVD播放器
net stop messenger-----停止信使服務(wù)
net start messenger----開(kāi)始信使服務(wù)
notepad--------打開(kāi)記事本
nslookup-------網(wǎng)絡(luò )管理的工具向導
ntbackup-------系統備份和還原
narrator-------屏幕“講述人”
ntmsmgr.msc----移動(dòng)存儲管理器
ntmsoprq.msc---移動(dòng)存儲管理員*作請求
netstat -an----(TC)命令檢查接口
syncapp--------創(chuàng )建一個(gè)公文包
sysedit--------系統配置編輯器
sigverif-------文件簽名驗證程序
sndrec32-------錄音機
shrpubw--------創(chuàng )建共享文件夾
secpol.msc-----本地安全策略
syskey---------系統加密,一旦加密就不能解開(kāi),保護windows xp系統的雙重密碼
services.msc---本地服務(wù)設置
Sndvol32-------音量控制程序
sfc.exe--------系統文件檢查器
sfc /scannow---windows文件保護
tsshutdn-------60秒倒計時(shí)關(guān)機命令
tourstart------xp簡(jiǎn)介(安裝完成后出現的漫游xp程序)
taskmgr--------任務(wù)管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打開(kāi)資源管理器
packager-------對象包裝程序
perfmon.msc----計算機性能監測程序
progman--------程序管理器
regedit.exe----注冊表
rsop.msc-------組策略結果集
regedt32-------注冊表編輯器
rononce -p ----15秒關(guān)機
regsvr32 /u *.dll----停止dll文件運行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盤(pán)檢查
certmgr.msc----證書(shū)管理實(shí)用程序
calc-----------啟動(dòng)計算器
charmap--------啟動(dòng)字符映射表
cliconfg-------SQL SERVER 客戶(hù)端網(wǎng)絡(luò )實(shí)用程序
Clipbrd--------剪貼板查看器
conf-----------啟動(dòng)netmeeting
compmgmt.msc---計算機管理
cleanmgr-------好東西整理
ciadv.msc------索引服務(wù)程序
osk------------打開(kāi)屏幕鍵盤(pán)
odbcad32-------ODBC數據源管理器
oobe/msoobe /a----檢查XP是否激活
lusrmgr.msc----本機用戶(hù)和組
logoff---------注銷(xiāo)命令
iexpress-------木馬捆綁工具,系統自帶
Nslookup-------IP地址偵測器
fsmgmt.msc-----共享文件夾管理器
utilman--------輔助工具管理器
gpedit.msc-----組策略
xp下運行命令大全.
$Systemroot$Documents and Settingsusername 目錄下
appwiz.cpl------------添加刪除程序
control userpasswords2--------用戶(hù)帳戶(hù)設置
cleanmgr-------垃圾整理
CMD--------------命令提示符可以當作是 Windows 的一個(gè)附件,Ping,Convert 這些不能在圖形環(huán)境下 使用的功能要借助它來(lái)完成。
cmd------jview察看Java虛擬機版本。
command.com------調用的則是系統內置的 NTVDM,一個(gè) DOS虛擬機。它完全是一個(gè)類(lèi)似 Virtual PC 的 虛擬環(huán)境,和系統本身聯(lián)系不大。當我們在命令提示符下運行 DOS 程序時(shí),實(shí)際上也 是自動(dòng)轉移到 NTVDM虛擬機下,和 CMD 本身沒(méi)什么關(guān)系。
calc-----------啟動(dòng)計算器
chkdsk.exe-----Chkdsk磁盤(pán)檢查
compmgmt.msc---計算機管理
conf-----------啟動(dòng) netmeeting
control userpasswords2-----User Account 權限設置
devmgmt.msc--- 設備管理器
diskmgmt.msc---磁盤(pán)管理實(shí)用程序
dfrg.msc-------磁盤(pán)碎片整理程序
drwtsn32------ 系統醫生
dvdplay--------啟動(dòng)Media Player
dxdiag-----------DirectX Diagnostic Tool
gpedit.msc-------組策略編輯器
gpupdate /target:computer /force 強制刷新組策略
eventvwr.exe-----事件查看器
explorer-------打開(kāi)資源管理器
logoff---------注銷(xiāo)命令
lusrmgr.msc----本機用戶(hù)和組
msinfo32---------系統信息
msconfig---------系統配置實(shí)用程序
net start (servicename)----啟動(dòng)該服務(wù)
net stop (servicename)-----停止該服務(wù)
notepad--------打開(kāi)記事本
nusrmgr.cpl-------同control userpasswords,打開(kāi)用戶(hù)帳戶(hù)控制面板
Nslookup-------IP地址偵測器
oobe/msoobe /a----檢查XP是否激活
perfmon.msc----計算機性能監測程序
progman--------程序管理器
regedit----------注冊表編輯器
regedt32-------注冊表編輯器
regsvr32 /u *.dll----停止dll文件運行
route print------查看路由表
rononce -p ----15秒關(guān)機
rsop.msc-------組策略結果集
rundll32.exe rundll32.exe %Systemroot%System32shimgvw.dll,ImageView_Fullscreen----啟動(dòng)一個(gè)空白的Windows 圖片和傳真查看器
secpol.msc--------本地安全策略
services.msc---本地服務(wù)設置
sfc /scannow-----啟動(dòng)系統文件檢查器
sndrec32-------錄音機
taskmgr-----任務(wù)管理器(適用于2000/xp/2003)
tsshutdn-------60秒倒計時(shí)關(guān)機命令
winchat--------XP自帶局域網(wǎng)聊天
winmsd---------系統信息
winver-----顯示About Windows 窗口
Windows XP的關(guān)機是由Shutdown.exe程序來(lái)控制的,位于Windows/System32文件夾中。如果想讓W(xué)indows 2000也實(shí)現同樣的效果,可以把Shutdown.exe復制到系統目錄下。
比如你的電腦要在22:00關(guān)機,可以選擇“開(kāi)始→運行”,輸入“at 22:00 Shutdown -s”, 這樣,到了22點(diǎn)電腦就會(huì )出現“系統關(guān)機”對話(huà)框,默認有30秒鐘的倒計時(shí)并提示你保存工作。如果你想以倒計時(shí)的方式關(guān)機,可以輸入“Shutdown.exe -s -t 3600”,這里表示60 分鐘后自動(dòng)關(guān)機,“3600”代表60分鐘。
設置好自動(dòng)關(guān)機后,如果想取消的話(huà),可以在運行中輸入“shutdown -a”。另外輸入“shutdown -i”,則可以打開(kāi)設置自動(dòng)關(guān)機對話(huà)框,對自動(dòng)關(guān)機進(jìn)行設置。
Shutdown.exe的參數,每個(gè)都具有特定的用途,執行每一個(gè)都會(huì )產(chǎn)生不同的效果,比如 “-s”就表示關(guān)閉本地計算機,“-a”表示取消關(guān)機操作,下面列出了更多參數, 可以在Shutdown.exe中按需使用。
-f:強行關(guān)閉應用程序
-m //計算機名:控制遠程計算機
-i:顯示圖形用戶(hù)界面,但必須是Shutdown的第一個(gè)選項
-l:注銷(xiāo)當前用戶(hù)
-r:關(guān)機并重啟
-t 時(shí)間:設置關(guān)機倒計時(shí)
-c "消息內容":輸入關(guān)機對話(huà)框中的消息內容(不能超127個(gè)字符)
有時(shí)候,我們需要定時(shí)關(guān)閉計算機,下面介紹一個(gè)在Windows XP下實(shí)現定時(shí)關(guān)機的簡(jiǎn)單方法。
指定系統在22分鐘后自動(dòng)關(guān)閉:點(diǎn)擊“開(kāi)始→運行”,在“打開(kāi)”中輸入命令“Shutdown -s -t 1320”(注意:引號不輸入,參數之間有空格,1320的單位是秒),單擊“確定”
按鈕即可。
指定系統在某個(gè)時(shí)間(比如12:00)自動(dòng)關(guān)閉:在“打開(kāi)”中輸入命令
“at 12:00 Shutdown -s”即可。
取消定時(shí)關(guān)機:在“打開(kāi)”中輸入命令“Shutdown -a”即可。
d. CreateProcess
下面這個(gè)示例的函數可以把給定的DOS命令執行一遍,并把DOS下的輸出內容記錄在buffer中。同時(shí)示范了匿名管道重定向輸出的用法:
-------------------------------------------------------------------------------------
BOOL CDOSDlg::ExecDosCmd()
{
#define EXECDOSCMD "dir c:" //可以換成你的命令
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]; //長(cháng)達1K的命令行,夠用了吧
strcpy(command,"Cmd.exe /C ");
strcat(command,EXECDOSCMD);
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //把創(chuàng )建進(jìn)程的標準錯誤輸出重定向到管道輸入
si.hStdOutput = hWrite; //把創(chuàng )建進(jìn)程的標準輸出重定向到管道輸入
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//關(guān)鍵步驟,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的空間來(lái)存儲輸出的內容,只要不是顯示文件內容,一般情況下是夠用了。
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是執行的結果,可以保存到文本,也可以直接輸出
AfxMessageBox(buffer); //這里是彈出對話(huà)框顯示
}
CloseHandle(hRead);
return TRUE;
}
聯(lián)系客服