Megosztás:


Alkalmazások indítása (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

Miután az alkalmazás megtalálta a fájlobjektumot, a következő lépés gyakran valamilyen módon történik. Előfordulhat például, hogy az alkalmazás egy másik alkalmazást szeretne elindítani, amely lehetővé teszi a felhasználó számára egy adatfájl módosítását. Ha a keresett fájl végrehajtható, előfordulhat, hogy az alkalmazás egyszerűen el szeretné indítani. Ez a dokumentum bemutatja, hogyan használhatja ShellExecute vagy ShellExecuteEx a feladatok elvégzéséhez.

A ShellExecute és a ShellExecuteEx használata

A ShellExecute vagy a ShellExecuteEx használatához az alkalmazásnak meg kell adnia a végrehajtandó fájl- vagy mappaobjektumot, valamint egy verb , a műveletet meghatározó objektumot. ShellExecuteesetében rendelje hozzá ezeket az értékeket a megfelelő paraméterekhez. A ShellExecuteExesetében töltse ki a SHELLEXECUTEINFO struktúra megfelelő tagjait. A két függvény viselkedésének finomhangolásához számos más tag vagy paraméter is használható.

A fájl- és mappaobjektumok lehetnek a fájlrendszer vagy a virtuális objektumok részei, és az elemek azonosítólistáinak (PIDL-jeinek) elérési útjai vagy mutatói alapján azonosíthatók.

Tárgyas igék

Az objektumokhoz elérhető igék lényegében az objektumok helyi menüjében található elemek. A rendelkezésre álló igék megkereséséhez keresse meg a beállításjegyzék megfelelő helyét.

\ HKEY_CLASSES_ROOTCLSID\{object_clsid}\Shell\verb

ahol object_clsid az objektum osztályazonosítója (CLSID), és verb az elérhető verbnév. A verb\parancs alkulcsa tartalmazza azokat az adatokat, amelyek jelzik, hogy mi történik a verb meghíváskor.

Ha meg szeretné tudni, hogy mely igék érhetők el előre definiált Shell objektumokhoz, keresse meg a beállításjegyzék megfelelő helyén.

\ HKEY_CLASSES_ROOTobject_name\shell\verb

ahol object_name az előre definiált Shell objektum neve. A parancs alkulcsa ismét tartalmazza azokat az adatokat, verb\ amelyek jelzik, hogy mi történik a verb meghíváskor.

Általánosan elérhető igék:

Verb Leírás
edit Elindít egy szerkesztőt, és megnyitja a dokumentumot szerkesztésre.
find Keresést kezdeményez a megadott könyvtárból kiindulva.
open Elindít egy alkalmazást. Ha ez a fájl nem végrehajtható fájl, a társított alkalmazás elindul.
print Kinyomtatja a dokumentumfájlt.
properties Megjeleníti az objektum tulajdonságait.
runas Elindít egy alkalmazást rendszergazdaként. A felhasználói fiókok felügyelete (UAC) kérni fogja a felhasználót, hogy járuljon hozzá az alkalmazás emelt szintű futtatásához, vagy adja meg az alkalmazás futtatásához használt rendszergazdai fiók hitelesítő adatait.

Mindegyik verb megfelel az alkalmazás konzolablakból való elindításához használt parancsnak. Ez openverb kitűnő példa, mivel gyakran támogatott. A .exe fájlok open esetében az alkalmazás egyszerűen elindul. Azonban gyakrabban használják egy adott fájlon működő alkalmazás elindítására. A Microsoft WordPad például .txt fájlokat nyithat meg. A openverb .txt fájl ezért az alábbi parancshoz hasonlónak felel meg:

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

Ha ShellExecute vagy ShellExecuteEx használatával nyit meg egy .txt fájlt, a rendszer elindítja a Wordpad.exe a megadott fájl argumentumaként. Egyes parancsok további argumentumokkal, például jelzőkkel is rendelkezhetnek, amelyek szükség szerint hozzáadhatók az alkalmazás megfelelő elindításához. A gyorsmenükről és az igei parancsokról további információt a Gyorsmenük kiterjesztésecímű témakörben talál.

Általánosságban elmondható, hogy egy adott fájlhoz elérhető igék listájának meghatározása kissé bonyolult. Sok esetben egyszerűen beállíthatja az lpVerb paramétert a NULL, amely meghívja a fájltípus alapértelmezett parancsát. Ez az eljárás általában egyenértékű az lpVerb "open"-ra állításával, de egyes fájltípusokhoz eltérő alapértelmezett parancs tartozhat. További információ: Helyi menük kiterjesztése és a ShellExecuteEx referencia dokumentációja.

A ShellExecuteEx használata aktiválási szolgáltatások biztosításához egy webhelyről

A webhelylánc szolgáltatásai szabályozhatják az elemek aktiválásának számos viselkedését. A Windows 8-hoz hasonlóan a webhelyláncra mutató mutatót is megadhat a ShellExecuteExezen viselkedések engedélyezéséhez. A ShellExecuteEx webhelyének biztosítása:

A Keresés párbeszédpanel indítása a ShellExecute használatával

Amikor egy felhasználó a jobb gombbal a Windows Intézőben egy mappaikonra kattint, az egyik menüelem a "Keresés". Ha kiválasztják ezt az elemet, az elindítja a Shell Keresési segédprogramot. Ez a segédprogram egy párbeszédpanelt jelenít meg, amely egy adott szöveges sztring fájljainak keresésére használható. Az alkalmazások programozott módon indíthatják el a könyvtár keresési segédprogramát a ShellExecute meghívásával, az "find" lpVerb paraméterrel, a könyvtár elérési útját pedig lpFile paraméterként. A következő kódsor például elindítja a search segédprogramot a c:\MyPrograms könyvtárhoz.

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

Egyszerű példa a ShellExecuteEx használatára

Az alábbi mintakonzolalkalmazás a ShellExecuteExhasználatát mutatja be. A legtöbb hibaellenőrzési kód nem lett megadva az egyértelműség kedvéért.

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

Az alkalmazás először lekéri a Windows könyvtár PIDL-jét, és számbavételt ad annak tartalmán, amíg meg nem találja az első .bmp fájlt. A korábbi példától eltérően IShellFolder::GetDisplayNameOf a fájl elemzési nevének lekérésére szolgál a megjelenítendő név helyett. Mivel ez egy fájlrendszermappa, az elemzési név egy teljesen minősített elérési út, amely szükséges a ShellExecuteExszámára.

Az első .bmp fájl megkeresése után a rendszer a megfelelő értékeket rendeli hozzá a SHELLEXECUTEINFO struktúra tagjaihoz. Az lpFile tag a fájl elemzési neveként van beállítva, az lpVerb tagot pedig NULLértékre, az alapértelmezett művelet elindításához. Ebben az esetben az alapértelmezett művelet "megnyitás". Ezt követően a rendszer átadja a struktúrát a ShellExecuteEx-nek, amely elindítja a bitképfájlok alapértelmezett kezelőjét (általában a MSPaint.exealkalmazást) a fájl megnyitásához open. A függvény visszatérése után a PIDL-ek felszabadulnak, és a Windows mappa IShellFolder interfésze felszabadul.