您的應用程式找到檔案對象之後,下一個步驟通常會以某種方式處理它。 例如,您的應用程式可能會想要啟動另一個應用程式,讓使用者修改數據檔。 如果感興趣的檔案是可執行檔,您的應用程式可能只想啟動它。 本文件討論如何使用 ShellExecute 或 ShellExecuteExecuteEx 來執行這些工作。
使用 ShellExecute 和 ShellExecuteEx
若要使用 ShellExecute 或 ShellExecuteEx,您的應用程式必須指定要執行的檔案或資料夾物件,以及verb指定要執行作業的 。 針對 ShellExecute,將這些值指派給適當的參數。 在使用 ShellExecuteEx時,填入 SHELLEXECUTEINFO 結構體的適當成員。 另外還有數個其他成員或參數可用來微調兩個函式的行為。
檔案和資料夾物件可以是文件系統或虛擬物件的一部分,而且可以透過專案標識碼清單的路徑或指標來識別它們。
對象動詞
物件可用的選項基本上是您在物件的快捷選單上找到的命令。 若要尋找可用的動詞,請在註冊表底下查看
HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Shell\verb
其中 object_clsid 是 對象的類別標識碼 (CLSID),而 verb 是可用 verb的名稱。 指令子鍵包含數據,指出當verb被呼叫時會發生什麼。verb\
若要找出哪些動詞可供 預先 Shell 定義的物件使用,請在登錄底下查看
\ HKEY_CLASSES_ROOTobject_name\shell\verb
其中 object_name 是預先定義 Shell 物件的名稱。 同樣地,verb\command 子鍵包含資料,指出當執行 verb 時會發生什麼事情。
常用的動詞包括:
Verb | 描述 |
---|---|
edit | 啟動編輯器,並開啟檔以供編輯。 |
find | 從指定的目錄開始起始搜尋。 |
open | 啟動應用程式。 如果這個檔案不是可執行檔,則會啟動其相關聯的應用程式。 |
列印檔案。 | |
properties | 顯示物件的屬性。 |
runas | 以系統管理員身分啟動應用程式。 用戶帳戶控制 (UAC) 會提示使用者同意提高許可權執行應用程式,或輸入用來執行應用程式的系統管理員帳戶認證。 |
每個 verb 對應到將用來從主控台視窗啟動應用程式的命令。 open verb是一個很好的範例,因為它通常受到支援。 針對 .exe 檔案, open 只需啟動應用程式即可。 不過,通常用來啟動在特定檔案上運作的應用程式。 例如,Microsoft WordPad 可以開啟 .txt 檔案。 open verb因此,.txt 檔案會對應至類似下列命令:
"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
當您使用 ShellExecute 或 ShellExecuteEx 開啟 .txt 檔案時,Wordpad.exe 會以指定的檔案作為其自變數啟動。 某些命令可以有額外的自變數,例如旗標,可以視需要新增以正確啟動應用程式。 如需對捷徑選單和動詞進行進一步探討,請參閱 延伸捷徑選單。
一般而言,嘗試判斷特定檔案的可用動詞清單有點複雜。 在許多情況下,您只要將 lpVerb 參數設定為 NULL,這會叫用檔類型的預設命令。 此程式通常相當於將 lpVerb 設定為 “open”,但某些文件類型可能會有不同的預設命令。 如需詳細資訊,請參閱 擴展快捷功能表 和 ShellExecuteEx 參考檔。
使用 ShellExecuteEx 從網站提供啟用服務
平台鏈的服務可以控制項目啟動的許多行為。 從 Windows 8 開始,您可以提供站台鏈結的指標,以 ShellExecuteEx 啟用這些行為。 若要提供網站給 ShellExecuteEx:
- 在 SHELLEXECUTEINFOfMask 成員中指定SEE_MASK_FLAG_HINST_IS_SITE旗標。
- 在 SHELLEXECUTEINFO的 hInstApp 成員中,提供 IUnknown。
使用 ShellExecute 啟動搜尋對話方塊
當使用者以滑鼠右鍵按下 Windows 檔案總管中的資料夾圖示時,其中一個功能表項是 「搜尋」。 如果他們選取該選項,則會啟動其搜尋工具。 此公用程式會顯示對話框,可用來搜尋指定文字字串的檔案。 應用程式可以透過程式設計方式啟動目錄的搜尋公用程式,方法是呼叫 ShellExecute,並以「find做為 lpVerb 參數,並將目錄路徑當作 lpFile 參數」。 例如,下列程式代碼行會啟動 c:\MyPrograms 目錄的 Search 公用程式。
ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);
如何使用ShellExecuteEx的簡單範例
下列範例主控台應用程式說明如何使用 ShellExecuteEx。 為了清楚起見,省略大部分的錯誤檢查程序代碼。
#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>
main()
{
LPITEMIDLIST pidlWinFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfWinFiles = NULL;
IShellFolder *psfDeskTop = NULL;
LPENUMIDLIST ppenum = NULL;
STRRET strDispName;
TCHAR pszParseName[MAX_PATH];
ULONG celtFetched;
SHELLEXECUTEINFO ShExecInfo;
HRESULT hr;
BOOL fBitmap = FALSE;
hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
hr = psfDeskTop->Release();
hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
CoTaskMemFree(pidlItems);
if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
{
fBitmap = TRUE;
break;
}
}
ppenum->Release();
if(fBitmap)
{
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = pszParseName;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
}
CoTaskMemFree(pidlWinFiles);
psfWinFiles->Release();
return 0;
}
應用程式會先擷取 Windows 目錄的 PIDL,並列舉其內容,直到找到第一個 .bmp 檔案為止。 不同於先前的範例,IShellFolder::GetDisplayNameOf 用來擷取檔案的剖析名稱,而不是擷取其顯示名稱。 因為這是文件系統資料夾,因此剖析名稱是完整路徑,這是ShellExecuteExecuteEx所需的路徑。
找到第一個 .bmp 檔案之後,會將適當的值指派給 SHELLEXECUTEINFO 結構的成員。 lpFile 成員會設定為檔案的剖析名稱,並將 lpVerb 成員設定為 NULL,以開始默認作業。 在此情況下,預設作業為「開啟」。 結構接著會傳遞至 ShellExecuteEx,它會啟動位圖檔案的默認處理程式,通常 MSPaint.exe至 open 檔案。 函式傳回之後,PIDL 會被釋放,Windows 資料夾的 IShellFolder 介面會被解除。