3 回答

TA貢獻1805條經驗 獲得超9個贊
ShellExecute的功能是運行一個外部程序(或者是打開一個已注冊的文件、打開一個目錄、打印一個文件等等),并對外部程序有一定的控制。有幾個API函數都可以實現這些功能,但是在大多數情況下ShellExecute是更多的被使用的,同時它并不是太復雜。
返回值:
執行成功會返回應用程序句柄
返回的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 API ShellExecute() 函數是文檔的不同于 Visual Basic Shell() 函數,可以將 ShellExecute() 函數傳遞的名稱,它將啟動關聯的應用程序,然后將文件名傳遞給應用程序。
在 Visual Basic 中開始一個新項目。默認情況下,將創建 Form1。
將以下代碼添加到 Form1 的通用聲明部分:
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
特殊用法:
如果將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相同

TA貢獻1900條經驗 獲得超5個贊
有三個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相同

TA貢獻1796條經驗 獲得超7個贊
ShellExecute(
HWND hwnd, //父窗口句柄
LPCSTR lpOperation, //操作類型
LPCSTR lpFile, //要進行操作的文件或路徑
LPCSTR lpParameters, //當lpOperation為“explore”時指定要傳遞的參數,通常設為NULL
LPCSTR lpDirectory, //指定默認目錄,通常設為NULL
INT nShowCmd //文件打開的方式,以通常方式還是最大化或最小化顯示
)
例子如下:
//調用計算器
ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
//調用記事本
ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL);
- 3 回答
- 0 關注
- 206 瀏覽
添加回答
舉報