啓動新的應用程序

在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等進行操作。這樣我們就可以設計有超級鏈接風格的程序了。

例如在VB中,我們首先聲明此函數(可由VB自帶的API遊覽器得到):

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

然後放置兩個Label,設置其屬性爲:

Name lbHomepage lbEMail
Caption .. mailto:[email protected]

並把字體改爲藍色有下劃線,然後分別在兩個Label的Click事件中加入以下代碼:

ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);

ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL);

OK!試試看,如何?夠酷的吧!

從上面可看出,ShellExecute的功能要強得多,並且可以完全替代WinExec(),事實上,WinExec()也是爲了和以前版本兼容而保留,所以,我們要儘量使用ShellExecute()。其實在WinAPI中,還有一個函數ShellExecuteEx() ,但其使用複雜,又不支持Windows NT,所以這裏就不作介紹了,有興趣的可以自已查詢WinAPI幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章