ShellExecute使用詳解

ShellExecute命令 

  ⑴ 函數原型: 

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd); 

  ⑵ 參數: 

  hwnd:指向父窗口的窗口句柄。此窗口接收應用程序產生的任何信息框。 

  lpOperation:一個空結束的字符串地址,此字符串指定要執行的操作。下面的操作字符串是有效的: 

"open " 此函數打開由參數lpFile指定的文件,此文件可以是一個可執行文件或文檔文件,也可是一個文件夾。 
"print " 此函數打印由參數lpFile指定的文件,此文件應是一個文檔文件,假如此文件是一個可執行文件,則打開此文件。 
"explore " 此函數搜索由參數lpFile指定的文件夾,此文件應是一個文檔文件, 

   此參數可以爲空。這種情況下,函數用於打開由參數lpFile指定的文件。 

  lpFile:一個空結束的字符串地址,此字符串指定要打開或打印的文件或者是要打開或搜索的文件夾。 

  lpParameters:假如參數lpFile指定一個可執行文件,lpParameters則是一個空結束的字符串地址,此字符串指定要傳遞給應用程序的參數。假如lpFile指定一個文檔文件,lpParameters應爲空。 

  lpDirectory:一個空結束的字符串地址,此字符串指定默認目錄。 

  nShowCmd:假如lpFile指定一個可執行文件,nShowCmd表明應用程序打開時如何顯示。假如lpFile指定一個文檔文件,nShowCmd應爲空。 

  ⑶ 返回值: 

  若函數調用成功,則返回值大於32,否則爲一個小於等於32的錯誤值。 

  說明:可以用此函數打開或搜索一個外殼文件夾。打開文件夾可用下面任何一種形式: 

ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL); 
   
  或 

ShellExecute(handle, "open ", path_to_folder, NULL, NULL, SW_SHOWNORMAL); 

  搜索文件夾,可用如下形式 

ShellExecute(handle, "explore ", path_to_folder, NULL, NULL, SW_SHOWNORMAL);

有三個API函數可以運行可執行文件WinExec、ShellExecute和CreateProcess。CreateProcess因爲使用複雜,比較少用。 
WinExec主要運行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW); 

ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件。 

首先必須引用shellapi.pas單元:uses ShellAPI; 

1.標準用法 

  ShellExecute函數原型及參數含義如下: 

  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。 

  若ShellExecute函數調用成功,則返回值爲被執行程序的實例句柄。若返回值小於32,則表示出現錯誤。 

  上述僅僅是ShellExecute函數的標準用法,下面將介紹它的特殊用法。 

2.特殊用法 

  如果將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。 

例子(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; 

最後的那個參數,爲窗口指定可視性方面的一個命令。 

請用下述任何一個常數 

SW_HIDE 隱藏窗口,活動狀態給令一個窗口 

SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口 

SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態 

SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態 

SW_SHOWMAXIMIZED 最大化窗口,並將其激活 

SW_SHOWMINIMIZED 最小化窗口,並將其激活 

SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口 

SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口 

SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口 

SW_SHOWNORMAL 與SW_RESTORE相同 

------------------------------------------------------------------------- 








始一個新的應用程序 
   ShellExecute(Handle, 'open', PChar('c:/test/app.exe'), nil, nil, SW_SHOW); 

打開記事本,並打開一個文件(系統能識別記事本應用程序的路徑,因此我們不必使用絕對路徑) 
   ShellExecute(Handle, 'open', PChar('notepad'), PChar('c:/test/readme.txt'), nil, SW_SHOW); 

打印一個文檔 
   ShellExecute(Handle, 'print', PChar('c:/test/test.doc'), nil, nil, SW_SHOW); 

   注意:可能你會看到word暫時的被打開,但它會自動關閉。 

打開一個HTML頁面 
   ShellExecute(Handle, 'open', PChar('
http://bbs.e-0631.cn'), nil, nil, SW_SHOW); 

你能通過一個已經註冊的文件類型來打開應用程序 
   ShellExecute(Handle, 'open', PChar('c:/test/readme.txt'), nil, nil, SW_SHOW); 

用windows Explorer 打開一個目錄 
   ShellExecute(Handle, 'explore', PChar('c:/windows)', nil, nil, SW_SHOW); 

運行一個DOS命令並立即返回 
   ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW); 

運行一個DOS命令並保持DOS窗口存在 
   ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW);

發佈了29 篇原創文章 · 獲贊 34 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章