Dela via


Starta applikationer (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

När programmet har hittat ett filobjekt är nästa steg ofta att agera på det på något sätt. Ditt program kanske till exempel vill starta ett annat program som gör att användaren kan ändra en datafil. Om filen av intresse är en körbar fil kanske ditt program helt enkelt vill starta den. I det här dokumentet beskrivs hur du använder ShellExecute eller ShellExecuteEx för att utföra dessa uppgifter.

Använda ShellExecute och ShellExecuteEx

Om du vill använda ShellExecute eller ShellExecuteEx måste ditt program ange det fil- eller mappobjekt som ska hanteras och ett verb som anger åtgärden. För ShellExecutetilldelar du dessa värden till lämpliga parametrar. För ShellExecuteExska du fylla i de lämpliga fälten i en SHELLEXECUTEINFO--struktur. Det finns också flera andra medlemmar eller parametrar som kan användas för att finjustera beteendet för de två funktionerna.

Fil- och mappobjekt kan ingå i filsystemet eller virtuella objekt, och de kan identifieras med antingen sökvägar eller pekare till objektidentifierarlistor (PIDL).

Objektverb

De verb som är tillgängliga för ett objekt är i princip de objekt som du hittar på ett objekts snabbmeny. Om du vill ta reda på vilka verb som är tillgängliga kan du titta i registret under

\ HKEY_CLASSES_ROOTCLSID\{object_clsid}\Shell\verb

där object_clsid är objektets klassidentifierare (CLSID) och verb är namnet på det tillgängliga verb. Kommandoundernyckeln verb\ innehåller data som anger vad som händer när denverb anropas.

Om du vill ta reda på vilka verb som är tillgängliga för fördefinierade Shell objekt tittar du i registret under

\ HKEY_CLASSES_ROOTobject_name\shell\verb

där object_name är namnet på det fördefinierade Shell objektet. Återigen innehåller kommandoundernyckeln data som anger vad som händer när den verb anropas.verb\

Vanliga verb är:

Verb Beskrivning
edit Startar en redigerare och öppnar dokumentet för redigering.
find Initierar en sökning med början från den angivna katalogen.
open Startar ett program. Om den här filen inte är en körbar fil startas dess associerade program.
print Skriver ut dokumentfilen.
properties Visar objektets egenskaper.
runas Startar ett program som administratör. Användarkontokontroll (UAC) uppmanar användaren att godkänna att köra programmet förhöjt eller ange autentiseringsuppgifterna för ett administratörskonto som används för att köra programmet.

Varje verb motsvarar det kommando som skulle användas för att starta programmet från ett konsolfönster. open verb Är ett bra exempel, eftersom det ofta stöds. För .exe-filer, open startar helt enkelt programmet. Det är dock vanligare att starta ett program som körs på en viss fil. Till exempel kan .txt filer öppnas av Microsoft WordPad. Filen openverb för en .txt motsvarar alltså något som liknar följande kommando:

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

När du använder ShellExecute eller ShellExecuteEx för att öppna en .txt fil startas Wordpad.exe med den angivna filen som argument. Vissa kommandon kan ha ytterligare argument, till exempel flaggor, som kan läggas till efter behov för att starta programmet korrekt. Mer information om snabbmenyer och verb finns i Utöka snabbmenyer.

I allmänhet är det lite komplicerat att försöka fastställa listan över tillgängliga verb för en viss fil. I många fall kan du helt enkelt ange parametern lpVerb till NULL-, som anropar standardkommandot för filtypen. Den här proceduren motsvarar vanligtvis inställningen lpVerb till "open", men vissa filtyper kan ha ett annat standardkommando. Mer information finns i Utöka snabbmenyer och referensdokumentationen för ShellExecuteEx.

Använda ShellExecuteEx för att tillhandahålla aktiveringstjänster från en webbplats

En webbplatskedjas tjänster kan styra många beteenden för objektaktivering. Från och med Windows 8 kan du ge en pekare till webbplatskedjan för att ShellExecuteEx för att aktivera dessa beteenden. Så här anger du webbplatsen för ShellExecuteEx:

Använda ShellExecute för att starta dialogrutan Sök

När en användare högerklickar på en mappikon i Utforskaren är ett av menyalternativen "Sök". Om de väljer det objektet Shell startar verktyget Sök. Det här verktyget visar en dialogruta som kan användas för att söka efter en angiven textsträng. Ett program kan programmatiskt starta sökverktyget för en katalog genom att anropa ShellExecute, med "find" som parametern lpVerb och katalogsökvägen som parametern lpFile . Följande kodrad startar till exempel sökverktyget för katalogen c:\MyPrograms.

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

Ett enkelt exempel på hur du använder ShellExecuteEx

Följande exempelkonsolprogram visar användningen av ShellExecuteEx. Mest felkontrollkod har utelämnats för tydlighet.

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

Programmet hämtar först PIDL för Windows-katalogen och räknar upp dess innehåll tills det hittar den första .bmp filen. Till skillnad från det tidigare exemplet används IShellFolder::GetDisplayNameOf för att hämta filens parsningsnamn i stället för dess visningsnamn. Eftersom det här är en filsystemmapp är parsningsnamnet en fullständigt kvalificerad sökväg, vilket är vad som behövs för ShellExecuteEx.

När den första .bmp filen har hittats tilldelas lämpliga värden till medlemmarna i en SHELLEXECUTEINFO struktur. Den lpFile--elementet är inställt på den filens parsningsnamn, och lpVerb--elementet till NULL-, för att påbörja standardåtgärden. I det här fallet är standardåtgärden "öppen". Strukturen skickas sedan till ShellExecuteEx, som startar standardhanteraren för bitmappsfiler, vanligtvis MSPaint.exe, till open filen. När funktionen returnerar frigörs PIDL:erna och Windows-mappens IShellFolder--gränssnitt släpps.