今天來說說ShellExecuteEx這個函數,先翻譯MSDN,然后看個樣例。
ShellExecuteEx Function
對指定應用程序運行某個操作
語法:
BOOL ShellExecuteEx(
LPSHELLEXECUTEINFO lpExecInfo
);
參數:
lpExecInfo
[in, out] 一個指向 SHELLEXECUTEINFO 結構的指針,用來傳遞和保存應用程序運行相關的信息。
返回值:
假設函數成功運行就返回TRUE,否則返回 FALSE 。可調用 GetLastError 獲取錯誤信息。
備注:
因為ShellExecuteEx 可以將運行托付給那些由組件對象模型COM激活的Shell 擴展(數據源,上下文菜單句柄,動詞實現),因此在調用ShellExecuteEx 之前要先初始化 COM。某些Shell 擴展要求單線程單元模型的COM,在這樣的情況下,應當像以下一般初始化COM:
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)
在某些情況下 ShellExecuteEx 並沒有使用這樣的類型的Shell 擴展,這時就無需初始化COM。盡管如此,總是在使用這個函數之前初始化COM是個不錯的舉措。
假設有多個顯示器,而且你指定了一個HWND 同一時候設置lpExecInfo 的成員lpVerb 為 "Properties",那么由ShellExecuteEx 創建的不論什么窗體都有可能顯示在不對的位置上。
假設這個函數運行成功,它會設置 SHELLEXECUTEINFO 的hInstApp 成員為一個大於32的值。假設函數運行失敗,hInstApp 成員被設置為SE_ERR_XXX(提示失敗的原因)。盡管為了兼容16位的windows應用程序hInstApp 被聲明成一個句柄,但它並非一個句柄。它僅僅能被轉型為整數,並同32或SE_ERR_XXX之類的錯誤代碼比較。
提供SE_ERR_XXX 之類的錯誤代碼是為了兼容ShellExecute。使用GetLastError能夠獲得更具體的錯誤信息。返回值能夠使下列之中的一個:
Error |
Description |
ERROR_FILE_NOT_FOUND |
指定文件不存在 |
ERROR_PATH_NOT_FOUND |
指定路徑不存在 |
ERROR_DDE_FAIL |
動態數據交換 (DDE) 處理失敗 |
ERROR_NO_ASSOCIATION |
沒有與制定文件名稱擴展相應的應用程序 |
ERROR_ACCESS_DENIED |
訪問指定文件被拒絕 |
ERROR_DLL_NOT_FOUND |
無法找到執行應用程序所必須的庫文件 |
ERROR_CANCELLED |
這個函數要求用戶提供很多其它其它信息(譯注:比方彈出對話框),但請求用戶被取消了 |
ERROR_NOT_ENOUGH_MEMORY |
沒有足夠的內存來運行操作 |
ERROR_SHARING_VIOLATION |
共享違規發生了 |
Windows 95/98/Me: ShellExecuteEx 為Microsoft Layer for Unicode (MSLU)所支持。為了使用這個函數,必須加入額外的文件到應用程序中去,請參考:Microsoft Layer for Unicode on Windows Me/98/95 Systems.
函數信息:
Minimum DLL Version |
shell32.dll version 3.51 or later |
Custom Implementation |
No |
Header |
shellapi.h |
Import library |
shell32.lib |
Minimum operating systems |
Windows NT 4.0, Windows 95 |
Unicode |
Implemented as ANSI and Unicode versions |
以下舉例說明怎樣使用這個函數,executePackage 這個函數用來運行某個應用程序。