Megosztás a következőn keresztül:


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

ShellExecute vagy ShellExecuteExhasználatához az alkalmazásnak meg kell adnia a végrehajtandó fájl- vagy mappaobjektumot, valamint a műveletet meghatározó ige. 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_ROOT\CLSID\{object_clsid}\Shell\verb

ahol object_clsid az objektum osztályazonosítója (CLSID), pedig az elérhető ige neve. A ige\parancs alkulcs tartalmazza azokat az adatokat, amelyek jelzik, hogy mi történik az adott ige meghívásakor.

Ha meg szeretné tudni, hogy mely igék érhetők el az előre definiált Shell-objektumokhoz, nézze meg a beállításjegyzékben.

HKEY_CLASSES_ROOT\object_name\shell\parancs

ahol object_name az előre definiált Shell-objektum neve. A ige\parancs alkulcs tartalmazza azokat az adatokat, amelyek jelzik, hogy mi történik az adott ige meghívásakor.

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

Ige Leírás
szerkeszt Elindít egy szerkesztőt, és megnyitja a dokumentumot szerkesztésre.
talál Keresést kezdeményez a megadott könyvtárból kiindulva.
nyitott Elindít egy alkalmazást. Ha ez a fájl nem végrehajtható fájl, a társított alkalmazás elindul.
nyomtat Kinyomtatja a dokumentumfájlt.
tulajdonságok 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.

Minden ige megfelel az alkalmazás konzolablakból való elindításához használt parancsnak. A nyitott ige jó példa, mivel általánosan támogatott. .exe fájlok esetében a megnyitása egyszerűen elindítja az alkalmazást. 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 .txt fájlhoz megnyitott ige tehát 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 azzal egyenértékű, hogy lpVerb "megnyitásra" van állítva, 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, a Rendszerhéj elindítja a 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 úgy, hogy meghívják ShellExecute, a "find" paramétert pedig az lpVerb paraméterként, a könyvtár elérési útját pedig az 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". A rendszer ezután átadja a struktúrát ShellExecuteEx, amely elindítja a bitképfájlok alapértelmezett kezelőjének ( általában MSPaint.exe) a fájl megnyitásához. A függvény visszatérése után a PIDL-ek felszabadulnak, és a Windows mappa IShellFolder interfésze felszabadul.