使用調(diào)用外部程序函數(shù)實(shí)現(xiàn)API函數(shù)高級(jí)功能
文章出處:網(wǎng)絡(luò)轉(zhuǎn)載 作者:未知 發(fā)布時(shí)間:2006-07-28
摘要本文以VisualBasic為例,介紹了在使用調(diào)用外部程序的辦法實(shí)現(xiàn)以下五種功能的方法:1)關(guān)機(jī)和重新啟動(dòng);2)使用缺?。J(rèn))的程序打開文件或鏈接;3)調(diào)用"資源管理器";4)復(fù)制和移動(dòng)文件夾;5)把DOS程序的屏幕顯示信息寫入文件。
關(guān)鍵詞VisualBasic,Shell函數(shù),外部程序
調(diào)用調(diào)用API函數(shù)可直接使用Windows底層資源,因此功能強(qiáng)大。然而API函數(shù)使用較復(fù)雜,易出錯(cuò)。本文將以VisualBasic6.0中的shell函數(shù)為例,詳細(xì)說明調(diào)用外部程序?qū)崿F(xiàn)一些windows高級(jí)功能的方法。
一、關(guān)機(jī)和重新啟動(dòng)Windows
在"開始-運(yùn)行"對(duì)話框或DOS窗口中輸入rundll.exeuser.exe,exitwindowsexec命令,Windows就會(huì)重新啟動(dòng);輸入rundll.exeuser.exe,exitwindows,機(jī)器關(guān)閉。
所以您在VisualBasic中使用下面兩個(gè)命令來實(shí)現(xiàn)重起和關(guān)機(jī):
Shell"rundll.exeuser.exe,exitwindowsexec",vbHide'重新啟動(dòng)
Shell"rundll.exeuser.exe,exitwindows",vbHide'關(guān)閉
二、使用缺?。J(rèn))的程序打開文件或鏈接
在Windows的Command子目錄中有一個(gè)Start.exe,在這個(gè)命令后加上一個(gè)文件名參數(shù),該文件即可用缺省程序打開。所以在VisualBasic中可使用下面的代碼:
DimFiletoOpen$
FiletoOpen="system.ini"
Shell"Start.exe"&FiletoOpen,vbHide
注意:1)如果變量FiletoOpen的值為包含長文件名的字符串,以上第三行應(yīng)為
Shell"Start.exe"&Chr(34)&FiletoOpen&Chr(34)'Chr(34)為雙引號(hào)。
這是因?yàn)楫?dāng)參數(shù)中的長文件名含有空格時(shí),程序會(huì)認(rèn)為空格以前的部分子符串為一個(gè)參數(shù),所以會(huì)產(chǎn)生找不到文件的錯(cuò)誤。例如要用Winword.exe打開"C:\mydocuments\mydoc.doc"時(shí),如果在"運(yùn)行"對(duì)話框中輸入start.exec:\mydocuments\mydoc.doc,系統(tǒng)尋找的文件是c:\my和documents\mydoc.doc兩個(gè)文件,所以會(huì)出錯(cuò)。正確的命令應(yīng)當(dāng)是start.exe"c:\mydocuments\mydoc.doc"
2)在上面第三行中,Start.exe后別忘了留空格。
另外程序員也常常希望用戶能點(diǎn)擊軟件上的鏈接而直接打開自己的主頁或給自己寫信。用下面的方法可以不另外添加控件而實(shí)現(xiàn)這種功能。
Dimurl$,email$
url="nwdonkey.uhome.net"
email="mailto:nwdonkey@371.net"
shell"start.exe"&url,vbHide
shell"start.exe"&email,vbHide
三、調(diào)用"資源管理器"
用下面的命令可調(diào)用Windows資源管理器,并打開指定的文件夾:
DimPathtoOpen$
PathtoOpen="c:\mydocuments"
Shell"explorer.exe"&PathtoOpen,vbNormalFocus
四、復(fù)制和移動(dòng)文件夾
是不是很懷念強(qiáng)大的DOS命令?其實(shí)所有的DOS外部命令所能實(shí)現(xiàn)的功能,您都能在VB中通過Shell函數(shù)來實(shí)現(xiàn)。比如您要把一個(gè)子目錄的包含下一級(jí)目錄的所有文件復(fù)制到另一個(gè)位置,可使用下面的代碼:
IfDir$("c:\mydos",vbDirectory)=""ThenMkDir"c:\mydos"'在硬盤上新建一個(gè)c:\mydos的文件夾。
Shell"xcopy.exec:\windows\command\*.*c:\mydos/s/e",vbHide
Shell"explorer.exe"&"c:\mydos",vbNormalFocus
同樣我們也以用shell來調(diào)用move.exe來實(shí)現(xiàn)來實(shí)現(xiàn)文件或文件夾的移動(dòng)。
說明:此方法僅限于外部DOS命令,并需要把參數(shù)中的長文件名轉(zhuǎn)換為8.3制文件名,轉(zhuǎn)換似乎可以用API函數(shù)實(shí)現(xiàn),我們自己編寫了不調(diào)用API函數(shù)實(shí)現(xiàn)這一功能的函數(shù),您如果需要請到http://go.163.com/
~nwdonkey/vb/去下載。
Contributor:NorthWestDonkey
五、把DOS程序的屏幕顯示信息寫入文件
Shell函數(shù)不支持DOS內(nèi)部命令,要想在VB中使用DOS內(nèi)部命令,就得使用迂回的辦法:先把DOS命令寫到一個(gè)BAT文件中,然后再用Shell函數(shù)調(diào)用該BAT文件。如果您是編寫DOS批處理的高手,則完全可以先編寫好BAT文件,然后再用Shell函數(shù)來調(diào)用。另外,大家還記得DOS命令中的管道命令符吧?例如〈和〉號(hào)可以把一個(gè)文件的內(nèi)容傳遞到另一個(gè)程序中去,也可把DOS應(yīng)用程序的屏幕輸出寫到一個(gè)文件中去。例如用下列代碼可把DOS命令copy的幫助信息寫到一個(gè)文件中去。
Open"c:\test.bat"ForOutputAs#1'建立批處理文件
Print#1,"copy/?>c:\copyhelp.txt"
Print#1,"@exit"
Close#1
Shell"c:\test.bat",vbHide
Shell"start.exec:\copyhelp.txt",vbHide
注意:'test.bat中最后一句必須是@exit,不然經(jīng)Shell調(diào)用后的批處理文件無法從內(nèi)存中退出。
這種方法可以把dos程序中顯示在屏幕上的信息寫入一個(gè)文件,因此對(duì)編寫一些dos應(yīng)用程序的windows版本特別有用。
以上以VisualBasic為例,講述了巧用Shell函數(shù)實(shí)現(xiàn)一些一般不容易實(shí)現(xiàn)的功能的方法。一般情況下,其他編程語言也都提供了類似的函數(shù)接口,在這些編程環(huán)境下也可以輕易實(shí)現(xiàn)上述功能。對(duì)本文,您如有什么問題請寄信到nwdonkey@371.net或到我的主頁http://nwdonkey.uhome.net/上留言。