在for DOS的C語言中,有一個system()函數,其功能是執行命令行程序,在VB中也有shell()函數,在Windows程序設計中WinAPI也為我們提供了類似的函數,它們就是WinExec()和ShellExecute(),下面就來討論一下這兩個函數的用法。
1)WinExec()
函數原型: UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
參數說明:(激活的意思是能接受焦點,即標題欄變成藍色)
lpCmdLine:以0結尾的字符串,命令行參數。
uCmdShow:新的應用程序的運行方式。其取值如下:
SW_HIDE隱藏
SW_MAXIMIZE最大化
SW_MINIMIZE最小化,並把Z order順序在此窗口之後(即窗口下一層)的窗口激活
SW_RESTORE激活窗口並還原為初始化大小
SW_SHOW以當前大小和狀態激活窗口
SW_SHOWDEFAULT以默認方式運行
SW_SHOWMAXIMIZED激活窗口並最大化
SW_SHOWMINIMIZED激活窗口並最小化
SW_SHOWMINNOACTIVE最小化但不改變當前激活的窗口
SW_SHOWNA以當前狀態顯示窗口但不改變當前激活的窗口
SW_SHOWNOACTIVATE以初始化大小顯示窗口但不改變當前激活的窗口
SW_SHOWNORMAL激活並顯示窗口,如果是最大(小)化,窗口將會還原。第一次運行程序 時應該使用這個值
比如說,我想要用記事本打開"C:\HDC.TXT",以正常方式運行:
WinExec("notepad c:\\hdc.txt",SW_SHOWNORMAL);
如果調用成功,這個函數會返回一個不小於31的值,否則調用失敗,其返回值的意義如下:
0系統內存或資源不足
ERROR_BAD_FORMAT.EXE文件格式無效(比如不是32位應用程序)
ERROR_FILE_NOT_FOUND指定的文件設有找到
ERROR_PATH_NOT_FOUND指定的路徑沒有找到
這個函數和system()非常類似,只能運行.EXE文件,這樣在WINDOWS中有它不盡人意的地方,比如不能用此方法通過關聯的方法打開文件,例如WinExec("1.html",SW_SHOWNA);就不能打開此文檔。
2)ShellExecute()
函數原型:
HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );
參數說明:
hwnd窗口的句柄
lpOperation進行的操作,如"open","print","explore"分別對應"打開","打印","游覽", 也可以為空(""),此時表示進行默認的操作。 lpFile 要操作的文件。
lpParameters如果lpFile指定的是一個可執行文件則表示參數
lpDirectory操作進行的目錄
nShowCmd程序的運行方式,其取值見上例。
如果這個函數調用成功,將返回實例的句柄,如果不成功,返回值包含錯誤信息,由於類型比較多,這裡就不一一列舉了,詳見WinApi的幫助。
這樣,上面的例子就可以改變為(假設窗口的句柄為Handle)
ShellExecute(Handle,"open","notepad","c:\\hdc.txt","",SW_SHOWNORMAL);
其實不用那麼復雜,因為.TXT的關聯程序就是記事本,所以只要這樣就可以了
ShellExecute(Handle,"","c:\\hdc.txt","","",SW_SHOWNORMAL);
這個函數和WIN9X中的命令行命令"start"類似,不光可以對文件進行操作,還可以對HTTP、MAILTO等進行操作。這樣我們就可以設計有超級鏈接風格的程序了。
在Form中然後放置兩個Label,設置其屬性為:
Name Caption
lbHomepage http://www.ccrun.com
lbEMail mailto:[email protected]
並把字體改為藍色有下劃線,然後分別在兩個Label的Click事件中加入以下代碼:
ShellExecute(Handle,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);
ShellExecute(Handle,"",lbEMail.Caption,"","",SW_SHOWNORMAL);
OK!試試看,如何?夠酷的吧!
從上面可看出,ShellExecute的功能要強得多,並且可以完全替代WinExec(),事實上,WinExec()也是為了和以前版本兼容而保留,所以,我們要盡量使用ShellExecute()。其實在WinAPI中,還有一個函數ShellExecuteEx() ,但其使用復雜,又不支持Windows NT,所以這裡就不作介紹了,有興趣的可以自已查詢WinAPI幫助。