ShellExecute

ShellExecute

ShellExecute的功能是運行一個外部程式(或者是打開一個已註冊的檔案、打開一個目錄、列印一個檔案等等),並對外部程式有一定的控制。有幾個API函式都可以實現這些功能,但是在大多數情況下ShellExecute是更多的被使用的,同時它並不是太複雜。

基本介紹

  • 外文名:ShellExecute
  • 作用:運行並控制一個外部程式
  • 領域:編程
  • 函式類型:API函式
原型參數,返回值,例子,特殊用法,VB語言,概括,定義聲明,參數說明,示例,

原型參數

注意事項:使用該函式時,需添加該頭檔案:
#include <shellapi.h>
ShellExecute函式原型及參數含義如下:
ShellExecute(
hWnd: HWND; {指定父視窗句柄}
Operation: PChar; {指定動作, 譬如: open、runas、print、edit、explore、find}
FileName: PChar; {指定要打開的檔案或程式}
Parameters: PChar; {給要打開的程式指定參數; 如果打開的是檔案這裡應該是 nil}
Directory: PChar; {預設目錄}
ShowCmd: Integer {打開選項}
): HINST;
ShowCmd 參數可選值:SW_HIDE = 0; {隱藏}
SW_SHOWNORMAL = 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL = 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED = 2; {最小化, 激活}
SW_SHOWMAXIMIZED = 3; {最大化, 激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {用最近的大小和位置顯示, 不激活}
SW_SHOW = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_MAX = 10; {同 SW_SHOWNORMAL}

返回值

執行成功會返回應用程式句柄
返回的HINSTANCE可以將它轉換為一個整數(%d),並比較它的值大於還是小於32或比較它的錯誤代碼
返回值大於32表示執行成功
返回值小於32表示執行錯誤
返回值可能的錯誤有: = 0 {記憶體不足}
ERROR_FILE_NOT_FOUND = 2; {檔案名稱錯誤}
ERROR_PATH_NOT_FOUND = 3; {路徑名錯誤}
ERROR_BAD_FORMAT = 11; {EXE 檔案無效}
SE_ERR_SHARE = 26; {發生共享錯誤}
SE_ERR_ASSOCINCOMPLETE = 27; {檔案名稱不完全或無效}
SE_ERR_DDETIMEOUT = 28; {逾時}
SE_ERR_DDEFAIL = 29; {DDE 事務失敗}
SE_ERR_DDEBUSY = 30; {正在處理其他 DDE 事務而不能完成該 DDE 事務}
SE_ERR_NOASSOC = 31; {沒有相關聯的應用程式}

例子

首先記得加上頭檔案<windows.h>
//調用計算器
ShellExecute(0,"open","calc.exe","","",SW_SHOWNORMAL);
如果是C++語言,可能會出現參數類型不兼容的情況,改為:
ShellExecute(0,(LPCWSTR)L"open",(LPCWSTR)L"CALC.EXE",(LPCWSTR)L"",(LPCWSTR)L"",SW_SHOWNORMAL);
(下同)
//調用記事本
ShellExecute(0,"open","NOTEPAD.EXE","","",SW_SHOWNORMAL);
●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函式的標準用法,下面將介紹它的特殊用法。

特殊用法

如果將FileName參數設定為“http:”協定格式,那么該函式將打開默認瀏覽器並連結到指定的URL地址。若用戶機器中安裝了多個瀏覽器,則該函式將根據Windows 9x/NT註冊表中http協定處理程式(Protocols Handler)的設定確定啟動哪個瀏覽器。
格式一:http://網站域名
如:ShellExecute(Handle, "open", "http:// ;
www.neu.edu.cn", "", "", SW_SHOWNORMAL);
格式二:http://網站域名/網頁檔案名稱
如:ShellExecute(Handle, "open"," http:// ;
www.neu.edu.cn/default.htm","","",
SW_SHOWNORMAL);
如果將FileName參數設定為“mailto:”協定格式,那么該函式將啟動默認郵件客戶程式,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程式,則該函式將根據Windows 9x/NT註冊表中mailto協定處理程式的設定確定啟動哪個郵件客戶程式。
格式一:mailto
如:ShellExecute(Handle,"open", "mailto:", "", "", SW_SHOWNORMAL);打開新郵件視窗。
格式二:mailto:用戶賬號@郵件伺服器地址
如:ShellExecute(Handle, "open"," mailto:[email protected]", "", "", SW_SHOWNORMAL);打開新郵件視窗,並自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)。
格式三:mailto:用戶賬號@郵件伺服器地址
subject=郵件主題&body=郵件正文
如:ShellExecute(handle, ‘open’, ‘ mailto:[email protected]?subject=Hello&Body=This is a test’,"", "", SW_SHOWNORMAL);打開新郵件視窗,並自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字元%0a。
例子(delphi):
在一個應用程式調用c:\Project1.exe;
ShellExecute(handle, 'open',"c:\Project1.exe",'字串內容',"", SW_SHOWNORMAL);
在Project1.exe里可以調用:
procedure TForm1.FormCreate(Sender: TObject);var i:integer;beginfor i:=1 to paramcount doif 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相同

VB語言

概括

可以使用 Windows API ShellExecute() 函式來啟動與給定的文檔擴展名關聯而無需知道關聯應用程式的名稱的應用程式。例如,您無法通過傳遞檔案名稱拱廊啟動畫筆程式。BMP 的 ShellExecute() 函式。

定義聲明

ShellExecute 函式打開,則列印指定的檔案。下面是從 Visual Basic 中調用此函式時要使用的聲明:
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _(ByVal hwnd As Long, ByVal lpszOp As String, _ByVal lpszFile As String, ByVal lpszParams As String, _ByVal LpszDir As String, ByVal FsShowCmd As Long) _As Long                

參數說明

hwnd
標識父視窗。該視窗可以接收任何 訊息框的應用程式產生(例如,用於錯誤報告).
lpszOp
指向一個空結束的字元串,指定執行的操作。這個字元串可以是“open”或“列印”。如果這個參數為"",“open”是默認值。
lpszFile
指向一個空結束的字元串,指定檔案
lpszParams
指向一個空結束的字元串指定參數 傳遞給應用程式時lpszFile參數所 指定一個執行檔。如果lpszFile指向一個文檔檔案,該參數為""。
LpszDir
指向一個空結束的字元串指定默認目錄。
FsShowCmd
指定應用程式視窗是否被顯示時 該應用程式被打開。

示例

下面的示例演示如何啟動一個應用程式或將文檔載入到其關聯的應用程式。Windows API ShellExecute() 函式是文檔的不同於 Visual Basic Shell() 函式,可以將 ShellExecute() 函式傳遞的名稱,它將啟動關聯的應用程式,然後將檔案名稱傳遞給應用程式。
  1. 在 Visual Basic 中開始一個新項目。默認情況下,將創建 Form1。
  2. 將以下代碼添加到 Form1 的通用聲明部分:
Option ExplicitPrivate Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As String, ByVal lpszFile As String, ByVal lpszParams As String,ByVal lpszDir As String, ByVal FsShowCmd As Long) As LongPrivate Declare Function GetDesktopWindow Lib "user32" () As LongConst SW_SHOWNORMAL = 1Const SE_ERR_FNF = 2&Const SE_ERR_PNF = 3&Const SE_ERR_ACCESSDENIED = 5&Const SE_ERR_OOM = 8& Const SE_ERR_DLLNOTFOUND = 32&Const SE_ERR_SHARE = 26&Const SE_ERR_ASSOCINCOMPLETE = 27&Const SE_ERR_DDETIMEOUT = 28&Const SE_ERR_DDEFAIL = 29&Const SE_ERR_DDEBUSY = 30&Const SE_ERR_NOASSOC = 31&Const ERROR_BAD_FORMAT = 11&Function StartDoc(DocName As String) As Long  Dim Scr_hDC As Long  Scr_hDC = GetDesktopWindow()  StartDoc = ShellExecute(Scr_hDC, "Open", DocName, "", "C:\", SW_SHOWNORMAL)End FunctionPrivate Sub Form_Click()  Dim r As Long, msg As String  r = StartDoc("C:\WINDOWS\ARCADE.BMP")  If r <= 32 Then              'There was an error    Select Case r      Case SE_ERR_FNF        msg = "File not found"      Case SE_ERR_PNF        msg = "Path not found"      Case SE_ERR_ACCESSDENIED        msg = "Access denied"      Case SE_ERR_OOM        msg = "Out of memory"      Case SE_ERR_DLLNOTFOUND        msg = "DLL not found"      Case SE_ERR_SHARE        msg = "A sharing violation occurred"      Case SE_ERR_ASSOCINCOMPLETE        msg = "Incomplete or invalid file association"      Case SE_ERR_DDETIMEOUT         msg = "DDE Time out"      Case SE_ERR_DDEFAIL        msg = "DDE transaction failed"      Case SE_ERR_DDEBUSY        msg = "DDE busy"      Case SE_ERR_NOASSOC        msg = "No association for file extension"      Case ERROR_BAD_FORMAT        msg = "Invalid EXE file or error in EXE image"      Case Else        msg = "Unknown error"    End Select    MsgBox msg  End IfEnd Sub

相關詞條

熱門詞條

聯絡我們