在Windows程序設計中WinAPI也爲咱們提供了相似的函數,它們就是WinExec()和ShellExecute(),下面就來討論一下這兩個函數的用法。
html
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 http://bcbtop.126.commailto:hugsnow@126.com
並把字體改成藍色有下劃線,而後分別在兩個Label的Click事件中加入如下代碼:
ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);
ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL);
OK!試試看,如何?夠酷的吧!
從上面可看出,ShellExecute的功能要強得多,而且能夠徹底替代WinExec(),事實上,WinExec()也是爲了和之前版本兼容而保留,因此,咱們要儘可能使用ShellExecute()。
介紹一個功能強大的API函數 ShellExecute
編譯 趙湘寧
問題的提出:
我使用MFC編寫一個APP,要求About對話框中顯示LOGO、公司名、地址和公司的URL連接。使用戶點擊URL連接之後,啓動瀏覽器訪問Web頁面,這種對話框中的熱連接使應用程序增色很多。我琢磨的方法是從系統註冊表中經過查找.htm 或 .html文件的關聯程序來得到缺省瀏覽器的名字,這樣好象有不少工做要作。此外,若是瀏覽器已經打開,老是開始一個新的實例替代當前已有的一個實例。想找一個容易一點的方法,但我查過有關的資料,沒有收穫,請高手指教。
解決方法:
若是有這樣的一個API函數該多好:OpenThisHereURLForMeNowPlease(),問題不就解決了!!我告訴你吧,有,但它不是你所想象的那個函數。到目前爲止,有關文檔中尚未提到過這麼一個有用的函數,它能打開桌面上的任何文件,也能打開Internet URL。惟一我能找到的參考資料是在Microsoft® Access KnowledgeBase中很曖昧地提到過這個函數。
這個難以想象的函數就是:ShellExecute,取代了WinExec。你能夠給它任何文件的名字,它都能識別出來並打開它。例如:
ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
用缺省的位圖編輯器打開一個叫iloveu.bmp的位圖文件,這個缺省的位圖編輯器多是Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
有關ShellExecute的詳細用法信息本身去參考有關資料吧,重要的是你知道了這個函數能打開任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系統註冊表HKEY_CLASSES_ROOT中全部的內容,判斷啓動那一個執行程序,而且啓動一個新的實例或使用DDE將文件名連到一打開的實例。而後,ShellExecute 返回打開文件的應用的實例句柄。
更奇妙的是ShellExecute不只能打開機器上的文件,還能打開Internet的站點地址。例如:
ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);
這個代碼使你能訪問微軟的主頁。當ShellExecute遇到文件名前面的「http:」時,能夠判斷出要打開的文件是Web文件,隨之啓動Internet Explorer 或者 Netscape Navigator 或者任何你使用的別的瀏覽器打開文件。ShellExecute還能識別其它協議,象FTP、GOPHER。甚至識別「mailto」,若是文件名指向「mailto:zxn@hq.cninfo.net」,它啓動電子郵件程序並打開一個待編輯的新郵件。總之,ShellExecute函數就是如此簡單地打開磁盤文件和Internet文件。若是將第二個參數「OPEN」改成「PRINT」或者「EXPLORE」,ShellExecute將能打印文件和打開文件夾。ShellExecute還有一個擴展函數ShellExecuteEx,所帶參數中有一個特殊的結構,功能更強,它的用法參見有關文檔。
如今,你知道了ShellExecute的祕密,用它很容易增長一個連接到你的About對話框。不是嗎。
怎樣加載其餘的應用程序?
三個SDK函數 winexec, shellexecute,createprocess可使用。WinExec最簡單,兩個參數,前一個指定路徑,後一個指定顯示方式.後一個參數值得說一下,好比泥用 SW_SHOWMAXMIZED方式去加載一個無最大化按鈕的程序,就是Neterm,calc等等,就不會出現正常的窗體,可是已經被加到任務列表裏了。
ShellExecute較 WinExex靈活一點,能夠指定工做目錄,下面的Example就是直接打開 c:\temp\1.txt,而不用加載與 txt文件關聯的應用程序,不少安裝程序完成後都會打開一個窗口,來顯示Readme or Faq,我猜就是這麼做的啦.
ShellExecute(NULL,NULL,_T("1.txt",NULL,_T("c:\\temp",SW_SHOWMAXMIZED)
CreateProcess最複雜,一共有十個參數,不過大部分均可以用NULL代替,它能夠指定進程的安全屬性,繼承信息,類的優先級等等.來看個很簡單的Example:
STARTUPINFO stinfo
//啓動窗口的信息
PROCESSINFO procinfo //進程的信息
CreateProcess(NULL,_T("notepad.exe",NULL,NULL.FALSE,
NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo),shell