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 ShellExecuteEx használatának egyszerű példája
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:
- Adja meg a SEE_MASK_FLAG_HINST_IS_SITE jelzőt a fMask tagban a SHELLEXECUTEINFO.
- Adja meg a IUnknown a hInstApp tagban lévő SHELLEXECUTEINFOértéket.
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.