Delphi WinExec ShellExec 用法介绍
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Delphi WinExec ShellExec 用法介紹
在Windows程序設(shè)計(jì)中WinAPI也為我們提供了類似的函數(shù),它們就是WinExec()和ShellExecute(),下面就來(lái)討論一下這兩個(gè)函數(shù)的用法。?
1)WinExec() 函數(shù)原型:?
UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);?
參數(shù)說(shuō)明:(激活的意思是能接受焦點(diǎn),即標(biāo)題欄變成藍(lán)色)?
lpCmdLine:以0結(jié)尾的字符串,命令行參數(shù)。?
uCmdShow:新的應(yīng)用程序的運(yùn)行方式。其取值如下:?
SW_HIDE 隱藏?
SW_MAXIMIZE 最大化?
SW_MINIMIZE 最小化,并把Z order順序在此窗口之后(即窗口下一層)的窗口激活?
SW_RESTORE 激活窗口并還原為初始化大小 SW_SHOW 以當(dāng)前大小和狀態(tài)激活窗口?
SW_SHOWDEFAULT 以默認(rèn)方式運(yùn)行?
SW_SHOWMAXIMIZED 激活窗口并最大化?
SW_SHOWMINIMIZED 激活窗口并最小化?
SW_SHOWMINNOACTIVE 最小化但不改變當(dāng)前激活的窗口?
SW_SHOWNA 以當(dāng)前狀態(tài)顯示窗口但不改變當(dāng)前激活的窗口?
SW_SHOWNOACTIVATE 以初始化大小顯示窗口但不改變當(dāng)前激活的窗口?
SW_SHOWNORMAL 激活并顯示窗口,如果是最大(小)化,窗口將會(huì)還原。第一次運(yùn)行程序 時(shí)應(yīng)該使用這個(gè)值?
比如說(shuō),我想要用記事本打開(kāi)"C:\HDC.TXT",以正常方式運(yùn)行:?
WinExec("notepad c:\\hdc.txt",SW_SHOWNORMAL);?
如果調(diào)用成功,這個(gè)函數(shù)會(huì)返回一個(gè)不小于31的值,否則調(diào)用失敗,其返回值的意義如下:?
0 系統(tǒng)內(nèi)存或資源不足?
ERROR_BAD_FORMAT .EXE文件格式無(wú)效(比如不是32位應(yīng)用程序)?
ERROR_FILE_NOT_FOUND 指定的文件設(shè)有找到?
ERROR_PATH_NOT_FOUND 指定的路徑?jīng)]有找到?
這個(gè)函數(shù)和system()非常類似,只能運(yùn)行.EXE文件,這樣在WINDOWS中有它不盡人意的地方,比如不能用此方法通過(guò)關(guān)聯(lián)的方法打開(kāi)文件,例如WinExec("1.html",SW_SHOWNA);就不能打開(kāi)此文檔。?
2)ShellExecute()?
函數(shù)原型:?
HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );?
參數(shù)說(shuō)明:?
hwnd 窗口的句柄?
lpOperation 進(jìn)行的操作,如"open","print","explore"分別對(duì)應(yīng)"打開(kāi)","打印","游覽", 也可以為空(""),此時(shí)表示進(jìn)行默認(rèn)的操作。?
lpFile 要操作的文件。?
lpParameters 如果lpFile指定的是一個(gè)可執(zhí)行文件則表示參數(shù)?
lpDirectory 操作進(jìn)行的目錄 nShowCmd 程序的運(yùn)行方式,其取值見(jiàn)上例。?
如果這個(gè)函數(shù)調(diào)用成功,將返回實(shí)例的句柄,如果不成功,返回值包含錯(cuò)誤信息,由于類型比較多,這里就不一一列舉了,詳見(jiàn)WinApi的幫助。?
這樣,上面的例子就可以改變?yōu)?假設(shè)窗口的句柄為Handle)?
ShellExecute(Handle,"open","notepad","c:\\hdc.txt","",SW_SHOWNORMAL);?
其實(shí)不用那么復(fù)雜,因?yàn)?TXT的關(guān)聯(lián)程序就是記事本,所以只要這樣就可以了?
ShellExecute(Handle,"","c:\\hdc.txt","","",SW_SHOWNORMAL);?
這個(gè)函數(shù)和WIN9X中的命令行命令"start"類似,不光可以對(duì)文件進(jìn)行操作,還可以對(duì)HTTP、MAILTO等進(jìn)行操作。這樣我們就可以設(shè)計(jì)有超級(jí)鏈接風(fēng)格的程序了。 例如在VB中,我們首先聲明此函數(shù)(可由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?
然后放置兩個(gè)Label,設(shè)置其屬性為:?
Name lbHomepage lbEMail Caption?http://bcbtop.126.commailto:hugsnow@126.com?
并把字體改為藍(lán)色有下劃線,然后分別在兩個(gè)Label的Click事件中加入以下代碼:?
ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);?
ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL);?
OK!試試看,如何?夠酷的吧!?
從上面可看出,ShellExecute的功能要強(qiáng)得多,并且可以完全替代WinExec(),事實(shí)上,WinExec()也是為了和以前版本兼容而保留,所以,我們要盡量使用ShellExecute()。?
介紹一個(gè)功能強(qiáng)大的API函數(shù) ShellExecute?
編譯 趙湘寧?
問(wèn)題的提出:?
我使用MFC編寫(xiě)一個(gè)APP,要求About對(duì)話框中顯示LOGO、公司名、地址和公司的URL鏈接。使用戶點(diǎn)擊URL鏈接以后,啟動(dòng)瀏覽器訪問(wèn)Web頁(yè)面,這種對(duì)話框中的熱鏈接使應(yīng)用程序增色不少。我琢磨的方法是從系統(tǒng)注冊(cè)表中通過(guò)查找.htm 或 .html文件的關(guān)聯(lián)程序來(lái)獲得缺省瀏覽器的名字,這樣好象有很多工作要做。此外,如果瀏覽器已經(jīng)打開(kāi),總是開(kāi)始一個(gè)新的實(shí)例替代當(dāng)前已有的一個(gè)實(shí)例。想找一個(gè)容易一點(diǎn)的方法,但我查過(guò)有關(guān)的資料,沒(méi)有收獲,請(qǐng)高手指教。?
解決方法:?
如果有這樣的一個(gè)API函數(shù)該多好:OpenThisHereURLForMeNowPlease(),問(wèn)題不就解決了!!我告訴你吧,有,但它不是你所想象的那個(gè)函數(shù)。到目前為止,有關(guān)文檔中還沒(méi)有提到過(guò)這么一個(gè)有用的函數(shù),它能打開(kāi)桌面上的任何文件,也能打開(kāi)Internet URL。唯一我能找到的參考資料是在Microsoft® Access KnowledgeBase中很曖昧地提到過(guò)這個(gè)函數(shù)。?
這個(gè)不可思議的函數(shù)就是:ShellExecute,取代了WinExec。你可以給它任何文件的名字,它都能識(shí)別出來(lái)并打開(kāi)它。例如:?
ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);?
用缺省的位圖編輯器打開(kāi)一個(gè)叫iloveu.bmp的位圖文件,這個(gè)缺省的位圖編輯器可能是Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。?
有關(guān)ShellExecute的詳細(xì)用法信息自己去參考有關(guān)資料吧,重要的是你知道了這個(gè)函數(shù)能打開(kāi)任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系統(tǒng)注冊(cè)表HKEY_CLASSES_ROOT中所有的內(nèi)容,判斷啟動(dòng)那一個(gè)執(zhí)行程序,并且啟動(dòng)一個(gè)新的實(shí)例或使用DDE將文件名連到一打開(kāi)的實(shí)例。然后,ShellExecute 返回打開(kāi)文件的應(yīng)用的實(shí)例句柄。?
更奇妙的是ShellExecute不僅能打開(kāi)機(jī)器上的文件,還能打開(kāi)Internet的站點(diǎn)地址。例如:?
ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);?
這個(gè)代碼使你能訪問(wèn)微軟的主頁(yè)。當(dāng)ShellExecute遇到文件名前面的“http:”時(shí),可以判斷出要打開(kāi)的文件是Web文件,隨之啟動(dòng)Internet Explorer 或者 Netscape Navigator 或者任何你使用的別的瀏覽器打開(kāi)文件。ShellExecute還能識(shí)別其它協(xié)議,象FTP、GOPHER。甚至識(shí)別“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它啟動(dòng)電子郵件程序并打開(kāi)一個(gè)待編輯的新郵件。總之,ShellExecute函數(shù)就是如此簡(jiǎn)單地打開(kāi)磁盤(pán)文件和Internet文件。如果將第二個(gè)參數(shù)“OPEN”改為“PRINT”或者“EXPLORE”,ShellExecute將能打印文件和打開(kāi)文件夾。ShellExecute還有一個(gè)擴(kuò)展函數(shù)ShellExecuteEx,所帶參數(shù)中有一個(gè)特殊的結(jié)構(gòu),功能更強(qiáng),它的用法參見(jiàn)有關(guān)文檔。?
現(xiàn)在,你知道了ShellExecute的秘密,用它很容易增加一個(gè)鏈接到你的About對(duì)話框。不是嗎。?
怎樣加載其他的應(yīng)用程序??
三個(gè)SDK函數(shù) winexec, shellexecute,createprocess可以使用。WinExec最簡(jiǎn)單,兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式.后一個(gè)參數(shù)值得說(shuō)一下,比如泥用 SW_SHOWMAXMIZED方式去加載一個(gè)無(wú)最大化按鈕的程序,就是Neterm,calc等等,就不會(huì)出現(xiàn)正常的窗體,但是已經(jīng)被加到任務(wù)列表里了。?
ShellExecute較 WinExex靈活一點(diǎn),可以指定工作目錄,下面的Example就是直接打開(kāi) c:\temp\1.txt,而不用加載與 txt文件關(guān)聯(lián)的應(yīng)用程序,很多安裝程序完成后都會(huì)打開(kāi)一個(gè)窗口,來(lái)顯示Readme or Faq,我猜就是這么作的啦.?
ShellExecute(NULL,NULL,_T("1.txt",NULL,_T("c:\\temp",SW_SHOWMAXMIZED)?
CreateProcess最復(fù)雜,一共有十個(gè)參數(shù),不過(guò)大部分都可以用NULL代替,它可以指定進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等.來(lái)看個(gè)很簡(jiǎn)單的Example:?
STARTUPINFO stinfo?
//啟動(dòng)窗口的信息?
PROCESSINFO procinfo //進(jìn)程的信息?
CreateProcess(NULL,_T("notepad.exe",NULL,NULL.FALSE,?
NORMAL_PRIORITY_?
CLASS,NULL,NULL, &stinfo,&procinfo),
轉(zhuǎn)載于:https://my.oschina.net/u/582827/blog/648493
總結(jié)
以上是生活随笔為你收集整理的Delphi WinExec ShellExec 用法介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Maven下载JasperReports
- 下一篇: 2016年Web前端面试题