調用 API 函數-ShellExecute實例


一、API函數ShellExecute用法

1.   函數功能:

運行一個外部程序(或者是打開一個已註冊的文件、打開一個目錄、打印一個文件等等),並對外部程序有一定的控制。

2、ShellExecute函數原型及參數含義如下:
  ShellExecute(
  hWnd: HWND; {指定父窗口句柄}
  Operation: PChar; {指定動作, 譬如: open、print、runas、edit、explore、find}
  FileName: PChar; {指定要打開的文件或程序}
  Parameters: PChar; {給要打開的程序指定參數; 如果打開的是文件這裏應該是 nil}
  Directory: PChar; {缺省目錄}
  ShowCmd: Integer {打開選項}
  ): HINST; {執行成功會返回應用程序句柄; 如果這個值 <= 32, 表示執行錯誤}

 
  //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","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);      
用缺省的位圖編輯器打開一個叫iloveu.bmp的位圖文件,這個缺省的位圖編輯器可能是 Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。

這個函數能打開任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系統註冊表HKEY_CLASSES_ROOT中所有的內容,判斷啓動那一個執行程序,並且啓動一個新的實例或使用DDE將文件名連到一打開的實例。然後,ShellExecute 返回打開文件的應用的實例句柄。

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(NULL, "open",“mailto:[email protected]”, NULL, NULL, SW_SHOWNORMAL);打開新郵件窗口。

//調用計算器
ShellExecute(0,"open","calc.exe","","",SW_SHOWNORMAL);
可能會出現參數類型不兼容的情況,改爲:
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函數的標準用法,下面將介紹它的特殊用法。

總之,ShellExecute函數就是如此簡單地打開磁盤文件和Internet文件。如果將第二個參數“OPEN”改爲“PRINT”或者“EXPLORE”,ShellExecute將能打印文件和打開文件夾。ShellExecute還有一個擴展函數ShellExecuteEx,所帶參數中有一個特殊的結構,功能更強,或者任何你使用的別的瀏覽器打開文件。

5.特殊用法

如果將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;
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相同

二、實例代碼

以下代碼僅適合於 Excel 2010:

Private 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

  Sub ShowGraphic()
    Dim FileName As String
    Dim Result As Long
    FileName = ThisWorkbook.path & "\flower.jpg"
    Result = ShellExecute(0&, vbNullString, FileName, _
        vbNullString, vbNullString, vbNormalFocus)
    If Result < 32 Then MsgBox "Error"
End Sub

Sub OpenTextFile()
    Dim FileName As String
    Dim Result As Long
    FileName = ThisWorkbook.path & "\textfile.txt"
        Result = ShellExecute(0&, vbNullString, FileName, _
        vbNullString, vbNullString, vbNormalFocus)
    If Result < 32 Then MsgBox "Error"
End Sub

 
Sub OpenURL()
    Dim URL As String
    Dim Result As Long
    URL =” http://nothingwmm.blog.163.com“
    Result = ShellExecute(0&, vbNullString, URL, _
        vbNullString, vbNullString, vbNormalFocus)
    If Result < 32 Then MsgBox "Error"
End Sub

Sub StartEmail()
    Dim Addr As String
    Dim Result As Long
    Addr = “mailto:[email protected]”
    Result = ShellExecute(0&, vbNullString, Addr, _
        vbNullString, vbNullString, vbNormalFocus)
    If Result < 32 Then MsgBox "Error"
End Sub


Sub OpenFile()
    Dim FileName As String
    Dim Result As Long
    FileName = "E:\1.sqd"
        Result = ShellExecute(0&, vbNullString, FileName, _
        vbNullString, vbNullString, vbNormalFocus)
    If Result < 32 Then MsgBox "Error"
End Sub




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章