天天看點

功能強大的ShellExecute

轉自:百度百科

#include <shellapi.h> ShellExecute函數原型及參數含義如下: ShellExecute( hWnd: HWND; {指定父視窗句柄} Operation: PChar; {指定動作, 譬如: open、runas、print、edit、explore、find [2]  } 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}

3傳回值編輯

執行成功會傳回 應用程式句柄 傳回的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; {沒有相關聯的 應用程式}

4例子編輯

//調用電腦 ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL); //調用 記事本 ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,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函數的标準用法,下面将介紹它的特殊用法。

5特殊用法編輯

如果将FileName參數設定為“http:”協定格式,那麼該函數将打開預設 浏覽器并連結到指定的URL位址。若使用者機器中安裝了多個 浏覽器,則該函數将根據Windows 9x/NT系統資料庫中http協定處理程式(Protocols Handler)的設定确定啟動哪個浏覽器。 格式一:http://網站域名 如:ShellExecute(Handle, "open", "http:// ; www.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL); 格式二:http://網站域名/網頁檔案名 如:ShellExecute(Handle, "open"," http:// ; www.neu.edu.cn/default.htm",NULL,NULL, SW_SHOWNORMAL); 如果将FileName參數設定為“mailto:”協定格式,那麼該函數将啟動預設郵件客戶程式,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若使用者機器中安裝了多個郵件客戶程式,則該函數将根據Windows 9x/NT系統資料庫中mailto協定處理程式的設定确定啟動哪個郵件客戶程式。 格式一:mailto 如:ShellExecute(Handle,"open", "mailto:", NULL, NULL, SW_SHOWNORMAL);打開新郵件視窗。 格式二:mailto:使用者賬号@郵件伺服器位址 如:ShellExecute(Handle, "open"," mailto:[email protected]", NULL, NULL, SW_SHOWNORMAL);打開新郵件視窗,并自動填入收件人位址。若指定多個收件人位址,則收件人位址之間必須用分号或逗号分隔開(下同)。 格式三:mailto:使用者賬号@郵件伺服器位址 subject=郵件主題&body=郵件正文 如:ShellExecute(handle, ‘open’, ‘ mailto:[email protected]?subject=Hello&Body=This is a test’,NULL, NULL, SW_SHOWNORMAL);打開新郵件視窗,并自動填入收件人位址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行 轉義字元%0a。 例子(delphi): 在一個 應用程式調用c:\Project1.exe; ShellExecute(handle, 'open',"c:\Project1.exe",'字串内容',NULL, 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相同

6VB語言編輯

概括

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

定義聲明

ShellExecute 函數打開,則列印指定的檔案。下面是從 Visual Basic 中調用此函數時要使用的聲明:

1

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 指向一個空結束的字元串指定的操作執行。這個字元串可以是“開放式”或“列印”。如果這 參數為NULL,“開放”是預設值。 lpszFile指向一個空結束的字元串指定檔案開。lpszParams 指向一個空結束的字元串指定參數 傳遞給應用程式時lpszFile參數所 指定一個可執行檔案。如果lpszFile指向一個字元串 指定一個文檔檔案,該參數為NULL。 LpszDir 指向一個空結束的字元串指定預設目錄。 FsShowCmd 指定應用程式視窗是否被顯示時 該應用程式被打開。

示例

下面的示例示範如何啟動一個應用程式或将文檔加載到其關聯的應用程式。Windows API ShellExecute() 函數是文檔的不同于 Visual Basic Shell() 函數,可以将 ShellExecute() 函數傳遞的名稱,它将啟動關聯的應用程式,然後将檔案名傳遞給應用程式。

  1. 在 Visual Basic 中開始一個新項目。預設情況下,将建立 Form1。
  2. 将以下代碼添加到 Form1 的通用聲明部分:
1

Option

Explicit     

Private

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

Private

Declare

Function

GetDesktopWindow

Lib

"user32"

()

As

Long

Const

SW_SHOWNORMAL = 1     

Const

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 Function      Private 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

If

End

Sub

參考資料