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í aplikace zadat objekt souboru nebo složky, na kterém se má jednat, a příkaz, 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_ROOT\\{object_clsid}\Shell\verb

kde object_clsid je identifikátor třídy (CLSID) objektu a sloveso je název dostupného příkazu. Sloveso \podklíč obsahuje data indikující, co se stane při vyvolání tohoto slovesa.

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

HKEY_CLASSES_ROOT\object_name\prostředí\sloveso

kde object_name je název předdefinovaného objektu Shell. Opět platí, že podklíč příkazu sloveso\ obsahuje data určující, co nastane, když je toto sloveso použito.

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

Sloveso Popis
upravit Spustí editor a otevře dokument pro úpravy.
najít Zahájí hledání počínaje zadaným adresářem.
otevřený Spustí aplikaci. Pokud tento soubor není spustitelný soubor, spustí se jeho přidružená aplikace.
tisknout Vytiskne soubor dokumentu.
vlastnosti 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é sloveso odpovídá příkazu, který by se použil ke spuštění aplikace z okna konzoly. Dobrým příkladem je otevření příkazu, protože se běžně podporuje. U souborů .exe jednoduše otevřením 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. sloveso otevřít pro soubor .txt by tak odpovídalo příkazu jako například následující:

"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 "otevřít", 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í 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 lpVerb parametr a cesta k adresáři jako lpFile parametr. 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, k otevření souboru. Po vrácení funkce se uvolní piDly a uvolní se rozhraní IShellFolder ve složce Windows rozhraní.