Sdílet prostřednictvím


Spouštění aplikací (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

Jakmile má aplikace umístěný objekt souboru, dalším krokem je často jednat na něj nějakým způsobem. Vaše aplikace může například chtít spustit jinou aplikaci, která uživateli umožní upravit datový soubor. Pokud je soubor zájmu spustitelný, vaše aplikace ho může jednoduše spustit. Tento dokument popisuje použití ShellExecute nebo ShellExecuteEx k provádění těchto úloh.

Použití ShellExecute a ShellExecuteEx

Chcete-li použít ShellExecute nebo ShellExecuteEx, musí vaše aplikace zadat soubor nebo objekt složky, na kterém se má jednat, a verb který určuje operaci. Pro ShellExecutepřiřaďte tyto hodnoty příslušným parametrům. V ShellExecuteExvyplňte příslušné členy struktury SHELLEXECUTEINFO. Existuje také několik dalších členů nebo parametrů, které lze použít k vyladění chování těchto dvou funkcí.

Objekty souborů a složek mohou být součástí systému souborů nebo virtuálních objektů a lze je identifikovat cestami nebo ukazateli na seznamy identifikátorů položek (PIDL).

Příkazy objektů

Slovesa dostupná pro objekt jsou v podstatě položky, které najdete v místní nabídce objektu. Pokud chcete zjistit, která slovesa jsou k dispozici, podívejte se do registru v části

\ HKEY_CLASSES_ROOTCLSID\{object_clsid}\Shell\verb

kde object_clsid je identifikátor třídy (CLSID) objektu a verb je název dostupné verb. Podklíč verb\příkazu obsahuje data označující, verb co se stane při vyvolání.

Pokud chcete zjistit, která slovesa jsou k dispozici pro předdefinované Shell objekty, podívejte se do registru v části

\ HKEY_CLASSES_ROOTobject_name\shell\verb

kde object_name je název předdefinovaného Shell objektu. Podklíč příkazu opět obsahuje data označující, co se stane při verb vyvolání.verb\

Mezi běžně dostupná slovesa patří:

Verb Popis
edit Spustí editor a otevře dokument pro úpravy.
find Zahájí hledání počínaje zadaným adresářem.
open Spustí aplikaci. Pokud tento soubor není spustitelný soubor, spustí se jeho přidružená aplikace.
print Vytiskne soubor dokumentu.
properties Zobrazí vlastnosti objektu.
runas Spustí aplikaci jako správce. Řízení uživatelských účtů (UAC) vyzve uživatele, aby udělil souhlas se spuštěním aplikace se zvýšenými oprávněními, nebo zadá přihlašovací údaje účtu správce použitého ke spuštění aplikace.

Každý verb odpovídá příkazu, který by se použil ke spuštění aplikace z okna konzoly. Jedná se openverb o dobrý příklad, protože se běžně podporuje. U .exe souborů open jednoduše spustíte aplikaci. Obvykle se ale používá ke spuštění aplikace, která pracuje s konkrétním souborem. Například .txt soubory může otevřít Microsoft WordPad. Soubor openverb .txt by tak odpovídal následujícímu příkazu:

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

Při použití ShellExecute nebo ShellExecuteEx, chcete-li otevřít .txt soubor, se Wordpad.exe spustí se zadaným souborem jako jeho argument. Některé příkazy můžou mít další argumenty, například příznaky, které je možné podle potřeby přidat, aby se aplikace spustila správně. Další diskuzi o místních nabídkách a příkazech najdete v tématu Rozšíření místních nabídek.

Obecně platí, že pokus o určení seznamu dostupných sloves pro určitý soubor je poněkud komplikovaný. V mnoha případech můžete jednoduše nastavit parametr lpVerb na NULL, který vyvolá výchozí příkaz pro typ souboru. Tento postup je obvykle ekvivalentní nastavení lpVerb na "open", ale některé typy souborů můžou mít jiný výchozí příkaz. Další informace najdete v dokumentaci k rozšíření místních nabídek a k ShellExecuteEx.

Použití ShellExecuteEx k poskytování aktivačních služeb z lokality

Služby řetězu webů můžou řídit mnoho chování aktivace položek. Od Windows 8 můžete poskytnout ukazatel na řetězec stránek pro ShellExecuteEx, abyste povolili toto chování. Poskytnutí webu pro ShellExecuteEx:

Spuštění dialogového okna Hledání pomocí ShellExecute

Když uživatel klikne pravým tlačítkem myši na ikonu složky v Průzkumníku Windows, jedna z položek nabídky je Hledat. Pokud tuto položku vyberou, Shell spustí svůj vyhledávací nástroj. Tento nástroj zobrazí dialogové okno, které lze použít k hledání souborů pro zadaný textový řetězec. Aplikace může programově spustit vyhledávací nástroj pro adresář voláním ShellExecute, s "find" jako parametr lpVerb a cesta k adresáři jako parametr lpFile . Například následující řádek kódu spustí vyhledávací nástroj pro c:\MyPrograms adresář.

ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);

Jednoduchý příklad použití ShellExecuteEx

Následující ukázková konzolová aplikace ilustruje použití ShellExecuteEx. Většina kódu kontroly chyb byla vynechána kvůli srozumitelnosti.

#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;
}

Aplikace nejprve načte PIDL adresáře Systému Windows a vytvoří výčet jejího obsahu, dokud nenajde první .bmp soubor. Na rozdíl od předchozího příkladu se IShellFolder::GetDisplayNameOf používá k načtení názvu parsování souboru místo jeho zobrazovaného názvu. Protože se jedná o složku systému souborů, parsovaný název je plně kvalifikovaná cesta, což je potřeba pro ShellExecuteEx.

Jakmile se první .bmp soubor nachází, přiřadí se členům struktury SHELLEXECUTE INFO odpovídající hodnoty. Člen lpFile je nastaven na název parsování souboru a lpVerb člen na NULL, aby se zahájila výchozí operace. V tomto případě je výchozí operace "otevřená". Struktura se pak předá ShellExecuteEx, která spustí výchozí obslužnou rutinu pro rastrové soubory, obvykle MSPaint.exe, do open souboru. Po vrácení funkce se uvolní piDly a uvolní se rozhraní IShellFolder ve složce Windows rozhraní.