標籤:
1,WinExec():
WinExec主要運行EXE檔案,不能運行其他類型的檔案。不用引用特別單元。 原型:UINT WinExec(exePath,ShowCmd) 樣本,我想要用記事本開啟"C:\HDC.TXT",以正常方式運行:WinExec(pChar(‘notepad c:\taoyoyo.txt‘),SW_SHOWNORMAL); 參數說明: --xePath:命令列參數。注意,要用pChar轉化一下。 --ShowCmd:外部程式的運行方式。其取值如下: ----SW_HIDE 隱藏 ----SW_MAXIMIZE 最大化 ----SW_MINIMIZE 最小化,並把Z order順序在此視窗之後(即視窗下一層)的視窗啟用 ----SW_RESTORE 啟用視窗並還原為初始化大小 SW_SHOW 以當前大小和狀態啟用視窗 ----SW_SHOW 用當前的大小和位置顯示一個視窗,同時令其進入活動狀態 ----SW_SHOWDEFAULT 以預設運行 ----SW_SHOWMAXIMIZED 啟用視窗並最大化 ----SW_SHOWMINIMIZED 啟用視窗並最小化 ----SW_SHOWMINNOACTIVE 最小化但不改變當前啟用的視窗 ----SW_SHOWNA 以目前狀態顯示視窗但不改變當前啟用的視窗 ----SW_SHOWNOACTIVATE 以初始化大小顯示視窗但不改變當前啟用的視窗 ----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() : 不僅可以運行EXE檔案,也可以運行系統已經關聯的檔案。 這個函數和WIN9X中的命令列命令"start"類似,不光可以對檔案進行操作,還可以對HTTP、MAILTO等進行操作。這樣我們可以設計有超級連結風格的程式了。 ShellExecute的功能要強得多,並且可以完全替代WinExec(),事實上,WinExec()也是為了和以前版本相容而保留,所以,我們要盡量使用ShellExecute()。 首先必須引用shellapi.pas單元:uses ShellAPI; 函數原型:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall; 參數含義如下: --hWnd:用於指定父視窗控制代碼。當函數調用過程出現錯誤時,它將作為Windows訊息視窗的父視窗。例如,可以將其設定為應用程式主視窗控制代碼,即Application.Handle,也可以將其設定為桌面視窗控制代碼(用GetDesktopWindow函數獲得)。 --Operation:用於指定要進行的操作。 ----open:動作表示執行由FileName參數指定的程式,或開啟由FileName參數指定的檔案或檔案夾; ----print:動作表示列印由FileName參數指定的檔案; ----explore:動作表示瀏覽由FileName參數指定的檔案夾。 ----為nil時,表示執行預設操作“open”。 --FileName:用於指定要開啟的檔案名稱、要執行的程式檔案名稱或要瀏覽的檔案夾名。 --Parameters:若FileName參數是一個可執行程式,則此參數指定命令列參數,否則此參數應為nil或PChar(0)。 --Directory:用於指定預設目錄。 --ShowCmd:若FileName參數是一個可執行程式,則此參數指定程式視窗的初始顯示方式,否則此參數應設定為0。 ----SW_HIDE 隱藏 ----SW_MAXIMIZE 最大化 ----SW_MINIMIZE 最小化,並把Z order順序在此視窗之後(即視窗下一層)的視窗啟用 ----SW_RESTORE 啟用視窗並還原為初始化大小 SW_SHOW 以當前大小和狀態啟用視窗 ----SW_SHOW 用當前的大小和位置顯示一個視窗,同時令其進入活動狀態 ----SW_SHOWDEFAULT 以預設運行 ----SW_SHOWMAXIMIZED 啟用視窗並最大化 ----SW_SHOWMINIMIZED 啟用視窗並最小化 ----SW_SHOWMINNOACTIVE 最小化但不改變當前啟用的視窗 ----SW_SHOWNA 以目前狀態顯示視窗但不改變當前啟用的視窗 ----SW_SHOWNOACTIVATE 以初始化大小顯示視窗但不改變當前啟用的視窗 ----SW_SHOWNORMAL 啟用並顯示視窗,如果是最大(小)化,視窗將會還原。第一次運行程式 時應該使用這個值 若ShellExecute函數調用成功,則傳回值為被執行程式的執行個體控制代碼。若傳回值小於32,則表示出現錯誤。 樣本: (1),剛才的例子:WinExec(pChar(‘notepad c:\taoyoyo.txt‘),SW_SHOWNORMAL); 就可以改變為(假設視窗的控制代碼為Handle) ShellExecute(Handle,‘open‘,‘notepad‘,‘c:\taoyoyo.txt‘,‘‘,SW_SHOWNORMAL); 此外,還可以不用那麼複雜,因為.TXT的關聯程式就是記事本,所以只要這樣就可以了: ShellExecute(Handle,‘‘,‘c:\taoyoyo.txt‘,‘‘,‘‘,SW_SHOWNORMAL); (2),例子(delphi): 在一個應用程式調用c:Project1.exe; ShellExecute(handle, ‘open‘,‘c:Project1.exe‘,‘字串內容‘,nil, SW_SHOWNORMAL); 在Project1.exe裡可以調用: procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i:=1 to paramcount do if ParamStr(i)〈〉‘‘ then showmessage(ParamStr(i)); end; (3),在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.com mailto:[email protected] 並把字型改為藍色有底線,然後分別在兩個Label的Click事件中加入以下代碼: ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL); ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL); 3,ShellExecute() 特殊用法 如果將FileName參數設定為“http:”協議格式,那麼該函數將開啟預設瀏覽器並連結到指定的URL地址。若使用者機器中安裝了多個瀏覽器,則該函數將根據Windows 9x/NT註冊表中http通訊協定處理常式(Protocols Handler)的設定確定啟動哪個瀏覽器。 格式一:http://網站網域名稱。 如:ShellExecute(handle, ‘open‘, http:// ; www.neu.edu.cn‘, nil, nil, SW_SHOWNORMAL); 格式二:http://網站網域名稱/網頁檔案名稱。 如:ShellExecute(handle, ‘open‘, http:// ; www.neu.edu.cn/default.htm‘,nil,nil, SW_SHOWNORMAL); 如果將FileName參數設定為“mailto:”協議格式,那麼該函數將啟動預設郵件客戶程式,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若使用者機器中安裝了多個郵件客戶程式,則該函數將根據Windows 9x/NT註冊表中mailto通訊協定處理常式的設定確定啟動哪個郵件客戶程式。 格式一:mailto: 如:ShellExecute(handle,‘open‘, ‘mailto:‘, nil, nil, SW_SHOWNORMAL);開啟新郵件視窗。 格式二:mailto:使用者帳號@郵件伺服器地址 如:ShellExecute(handle, ‘open‘,‘ mailto:[email protected]‘, nil, nil, SW_SHOWNORMAL);開啟新郵件視窗,並自動填入收件者地址。若指定多個收件者地址,則收件者地址之間必須用分號或逗號分隔開(下同)。 格式三:mailto:使用者帳號@郵件伺服器地址?subject=郵件主題&body=郵件內文 如:ShellExecute(handle, ‘open‘, ‘ mailto:[email protected]?subject=Hello&Body=This is a test‘, nil, nil, SW_SHOWNORMAL);開啟新郵件視窗,並自動填入收件者地址、郵件主題和郵件內文。若郵件內文包括多行文本,則必須在每行文本之間加入換行逸出字元%0a。 =============== 其它文章: 介紹一個功能強大的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:[email protected]”,它啟動電子郵件程式並開啟一個待編輯的新郵件。總之,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)
--本文來源於[TTT BLOG]:http://www.taoyoyo.net/ttt/post/433.html
Delphi調用外部程式函數:WinExec() 和ShellExecute詳解