共用方式為


啟動應用程式(ShellExecute、ShellExecuteExecuteEx、SHELLEXECUTEINFO)

您的應用程式找到檔案對象之後,下一個步驟通常會以某種方式處理它。 例如,您的應用程式可能會想要啟動另一個應用程式,讓使用者修改數據檔。 如果感興趣的檔案是可執行檔,您的應用程式可能只想啟動它。 本文件討論如何使用 ShellExecuteShellExecuteExecuteEx 來執行這些工作。

使用 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 啟動應用程式。 如果這個檔案不是可執行檔,則會啟動其相關聯的應用程式。
print 列印檔案。
properties 顯示物件的屬性。
runas 以系統管理員身分啟動應用程式。 用戶帳戶控制 (UAC) 會提示使用者同意提高許可權執行應用程式,或輸入用來執行應用程式的系統管理員帳戶認證。

每個 verb 對應到將用來從主控台視窗啟動應用程式的命令。 open verb是一個很好的範例,因為它通常受到支援。 針對 .exe 檔案, open 只需啟動應用程式即可。 不過,通常用來啟動在特定檔案上運作的應用程式。 例如,Microsoft WordPad 可以開啟 .txt 檔案。 open verb因此,.txt 檔案會對應至類似下列命令:

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"

當您使用 ShellExecuteShellExecuteEx 開啟 .txt 檔案時,Wordpad.exe 會以指定的檔案作為其自變數啟動。 某些命令可以有額外的自變數,例如旗標,可以視需要新增以正確啟動應用程式。 如需對捷徑選單和動詞進行進一步探討,請參閱 延伸捷徑選單

一般而言,嘗試判斷特定檔案的可用動詞清單有點複雜。 在許多情況下,您只要將 lpVerb 參數設定為 NULL,這會叫用檔類型的預設命令。 此程式通常相當於將 lpVerb 設定為 “open”,但某些文件類型可能會有不同的預設命令。 如需詳細資訊,請參閱 擴展快捷功能表ShellExecuteEx 參考檔。

使用 ShellExecuteEx 從網站提供啟用服務

平台鏈的服務可以控制項目啟動的許多行為。 從 Windows 8 開始,您可以提供站台鏈結的指標,以 ShellExecuteEx 啟用這些行為。 若要提供網站給 ShellExecuteEx

使用 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 介面會被解除。