Rendszerhéjhivatkozások
A Shell-hivatkozás olyan adatobjektum, amely a Shell névterében egy másik objektum elérésére használt információt tartalmaz, vagyis a Windows Intézőben látható összes objektumot. A Shell-hivatkozásokon keresztül elérhető objektumok típusai közé tartoznak a fájlok, mappák, lemezmeghajtók és nyomtatók. A rendszerhéjhivatkozások lehetővé teszik, hogy egy felhasználó vagy alkalmazás a névtér bármely pontjáról hozzáférjen egy objektumhoz. A felhasználónak vagy alkalmazásnak nem kell tudnia az objektum aktuális nevét és helyét.
Tudnivalók a Shell-hivatkozásokról
A felhasználó létrehoz egy Shell-hivatkozást az objektum helyi menüjének Parancsikon létrehozása parancsával. A rendszer automatikusan létrehoz egy ikont a Shell-hivatkozáshoz úgy, hogy az objektum ikonját egy kis nyíllal (más néven a rendszer által definiált hivatkozásátfedő ikonnal) kombinálja, amely az ikon bal alsó sarkában jelenik meg. Az ikonnal rendelkező Shell-hivatkozást parancsikonnak nevezzük; a Shell-hivatkozás és a parancsikon kifejezés azonban gyakran felcserélhető. A felhasználó általában parancsikonokat hoz létre, amelyek gyors hozzáférést biztosítanak az almappákban vagy más számítógépek megosztott mappáiban tárolt objektumokhoz. A felhasználók létrehozhatnak például egy parancsikont egy Almappában található Microsoft Word-dokumentumhoz, és elhelyezhetik a parancsikont az asztalon. A felhasználó ezután a parancsikon ikonra duplán kattintva megnyithatja a dokumentumot. Ha a parancsikon létrehozása után áthelyezi vagy átnevezi a dokumentumot, a rendszer megkísérli frissíteni a parancsikont, amikor a felhasználó legközelebb kiválasztja.
Az alkalmazások Shell-hivatkozásokat és parancsikonokat is létrehozhatnak és használhatnak. Egy szövegszerkesztő alkalmazás például létrehozhat egy Shell-hivatkozást a legutóbb használt dokumentumok listájának implementálásához. Egy alkalmazás egy Shell-hivatkozást hoz létre az IShellLink felülettel egy Shell-hivatkozásobjektum létrehozásához. Az alkalmazás az IPersistFile vagy IPersistStream felületet használja az objektum fájlban vagy streamben való tárolásához.
Jegyzet
Url-címre mutató hivatkozás létrehozásához nem használhatja IShellLink.
Ez az áttekintés ismerteti az IShellLink felületet, és ismerteti, hogyan hozhat létre és oldhat fel Shell-hivatkozásokat egy Microsoft Win32-alapú alkalmazásból. Mivel a Shell-hivatkozások tervezése az OLE-összetevőobjektum-modellen (COM) alapul, az áttekintés elolvasása előtt ismernie kell a COM és az OLE programozás alapfogalmait.
Hivatkozásfeloldás
Ha egy felhasználó létrehoz egy parancsikont egy objektumhoz, és az objektum neve vagy helye később megváltozik, a rendszer automatikusan elvégzi a frissítés vagy a feloldás lépéseit, a parancsikont, amikor a felhasználó legközelebb kiválasztja. Ha azonban egy alkalmazás létrehoz egy Shell-hivatkozást, és egy streamben tárolja, a rendszer nem próbálja meg automatikusan feloldani a hivatkozást. Az alkalmazásnak fel kell oldania a hivatkozást az IShellLink::Resolve metódus meghívásával.
Shell-hivatkozás létrehozásakor a rendszer adatokat ment a hivatkozásról. Hivatkozás feloldásakor – automatikusan vagy egy IShellLink:: hívás feloldása esetén – a rendszer először lekéri a Shell-hivatkozáshoz társított elérési utat a Shell-hivatkozás azonosítólistájára mutató mutatóval. További információ az azonosítólistáról: Elemazonosítók és azonosítólisták. A rendszer megkeresi a társított objektumot az elérési úton, és ha megtalálja az objektumot, feloldja a hivatkozást. Ha a rendszer nem találja az objektumot, az Elosztott hivatkozáskövetési és objektumazonosítók (DLT) szolgáltatást hívja meg, ha van ilyen, az objektum megkereséséhez. Ha a DLT szolgáltatás nem érhető el, vagy nem találja az objektumot, a rendszer ugyanabban a könyvtárban keres egy azonos fájllétrehozási idővel és attribútumokkal rendelkező, de eltérő nevű objektumot. Az ilyen típusú keresés feloldja az átnevezett objektumra mutató hivatkozást.
Ha a rendszer továbbra sem találja az objektumot, a címtárakban, az asztalon és a helyi kötetekben keres rekurzív módon, bár egy azonos nevű vagy létrehozási idővel rendelkező objektum könyvtárfája. Ha a rendszer továbbra sem talál egyezést, megjelenik egy párbeszédpanel, amely a felhasználót egy hely megadására kéri. Egy alkalmazás letilthatja a párbeszédpanelt, ha megadja a SLR_NO_UI értéket az IShellLink::Resolvehívásban.
A komponensobjektum-kódtár inicializálása
Ahhoz, hogy egy alkalmazás billentyűparancsokat hozhasson létre és oldhasson fel, inicializálnia kell az összetevő-objektumtárat a CoInitialize függvény meghívásával. A CoInitialize hívásához a CoUninitialize függvény megfelelő hívására van szükség, amelyet az alkalmazásnak a leállításakor kell hívnia. A CoUninitialize meghívása biztosítja, hogy az alkalmazás mindaddig ne fejeződjön be, amíg az összes függőben lévő üzenetét meg nem kapja.
Location-Independent nevek
A rendszer helyfüggetlen neveket biztosít a Megosztott mappákban tárolt objektumokra mutató Shell-hivatkozásokhoz. Ha az objektum helyileg van tárolva, a rendszer megadja az objektum helyi elérési útját és fájlnevét. Ha az objektum távolról van tárolva, a rendszer egy univerzális elnevezési konvenciós (UNC) hálózati erőforrásnevet biztosít az objektum számára. Mivel a rendszer helyfüggetlen neveket biztosít, a Shell-csatolások univerzális névként szolgálhatnak a más számítógépekre átvitt fájlokhoz.
Fájlok csatolása
Amikor a felhasználó az objektum helyi menüjében a Parancsikon létrehozása parancsot választva létrehoz egy objektumra mutató parancsot, a Windows egy hivatkozásfájlban tárolja az objektum eléréséhez szükséges információkat – egy bináris fájlban, amely rendelkezik a .lnk fájlnévkiterjesztéssel. A hivatkozásfájl a következő információkat tartalmazza:
- A parancsikon által hivatkozott objektum helye (elérési útja).
- A megfelelő objektum munkakönyvtára.
- Azon argumentumok listája, amelyeket a rendszer átad a megfelelő objektumnak, amikor a IContextMenu::InvokeCommand metódus aktiválva van a parancsikonhoz.
- A megfelelő objektum kezdeti megjelenítési állapotának beállításához használt megjelenítési parancs. Ez az SW_ ShowWindow.
- A parancsikon ikonjának helye (elérési útja és indexe).
- A parancsikon leírási sztringje.
- A billentyűparancs billentyűparancsa.
Hivatkozásfájl törlésekor a megfelelő objektumra nincs hatással.
Ha egy másik parancsikonra mutató parancsikont hoz létre, a rendszer egyszerűen átmásolja a hivatkozásfájlt ahelyett, hogy új hivatkozásfájlt hoz létre. Ebben az esetben a billentyűparancsok nem lesznek függetlenek egymástól.
Egy alkalmazás regisztrálhat egy fájlnévkiterjesztést parancsikonfájl-típusként. Ha egy fájlnak van egy fájlnévkiterjesztése, amelyet parancsikonfájltípusként regisztráltak, a rendszer automatikusan hozzáadja a rendszer által meghatározott hivatkozásátfedő ikont (egy kis nyíl) a fájl ikonjára. Ha a fájlnévkiterjesztést parancsikonfájltípusként szeretné regisztrálni, hozzá kell adnia az IsShortcut értéket a fájlnévkiterjesztés beállításjegyzék-leírásához, ahogyan az az alábbi példában látható. Vegye figyelembe, hogy a rendszerhéjat újra kell indítani az átfedés ikon érvénybe lépéséhez. Az IsShortcut nem rendelkezik adatértékekkel.
HKEY_CLASSES_ROOT
.xyz
(Default) = XYZApp
XYZApp
IsShortcut
Parancsikonnevek
A parancsikon neve, amely egy sztring, amely a Shell-hivatkozás ikonja alatt jelenik meg, valójában maga a parancsikon fájlneve. A felhasználó úgy szerkesztheti a leírási sztringet, hogy kijelöli és beír egy új sztringet.
A billentyűparancsok helye a névtérben
A parancsikon az asztalon vagy a Shell névterében bárhol létezhet. Hasonlóképpen a parancsikonhoz társított objektum is létezhet bárhol a Shell névterében. Az alkalmazások a IShellLink::SetPath metódussal állíthatják be a társított objektum elérési útját és fájlnevét, valamint a IShellLink::GetPath metódust az objektum aktuális elérési útjának és fájlnevének lekéréséhez.
Parancsikon munkakönyvtára
A munkakönyvtár az a könyvtár, amelyben egy parancsikon megfelelő objektuma betölti vagy tárolja a fájlokat, ha a felhasználó nem azonosít egy adott könyvtárat. A hivatkozásfájl tartalmazza a megfelelő objektum munkakönyvtárának nevét. Az alkalmazások az IShellLink::SetWorkingDirectory metódussal állíthatják be a megfelelő objektum munkakönyvtárának nevét, és az IShellLink::GetWorkingDirectory metódussal lekérhetik a megfelelő objektum aktuális munkakönyvtárának nevét.
Parancsikon parancssori argumentumai
A hivatkozásfájl parancssori argumentumokat tartalmaz, amelyeket a Rendszerhéj átad a megfelelő objektumnak, amikor a felhasználó kiválasztja a hivatkozást. Az alkalmazások az IShellLink::SetArguments metódussal állíthatják be a parancsikon parancssori argumentumait. Hasznos parancssori argumentumokat beállítani, ha a megfelelő alkalmazás, például egy linker vagy fordító speciális jelölőket használ argumentumként. Az alkalmazások az IShellLink::GetArguments metódussal lekérhetik a parancssori argumentumokat egy parancsikonból.
Parancsok billentyűparancsok megjelenítése
Amikor a felhasználó duplán kattint egy parancsikonra, a rendszer elindítja a megfelelő objektumhoz társított alkalmazást, és beállítja az alkalmazás kezdeti megjelenítési állapotát a parancsikon által megadott megjelenítési parancs alapján. A megjelenítési parancs a ShowWindow függvény leírásában szereplő SW_ értékek bármelyike lehet. Az alkalmazások az IShellLink::SetShowCmd metódussal állíthatják be egy parancsikon megjelenítési parancsát, és lekérhetik az aktuális megjelenítési parancsot az IShellLink::GetShowCmd metódussal.
Billentyűparancsok
A többi Shell-objektumhoz hasonlóan egy parancsikon is ikonnal rendelkezik. A felhasználó a parancsikonhoz társított objektumot a parancsikon ikonra duplán kattintva érheti el. Amikor a rendszer létrehoz egy ikont egy parancsikonhoz, a megfelelő objektum bitképét használja, és hozzáadja a rendszer által definiált hivatkozásátfedő ikont (egy kis nyíl) a bal alsó sarokhoz. Az alkalmazások az IShellLink::SetIconLocation metódussal beállíthatják a parancsikon ikonjának helyét (elérési útját és indexét). Egy alkalmazás az IShellLink::GetIconLocation metódussal lekérheti ezt a helyet.
Billentyűparancsok leírása
A parancsikonok leírásokkal rendelkeznek, de a felhasználó soha nem látja őket. Az alkalmazások leírással bármilyen szöveges információt tárolhatnak. A leírások az IShellLink::SetDescription metódussal vannak beállítva, és az IShellLink::GetDescription metódussal kérhetők le.
Billentyűparancsok
Egy billentyűparancs objektumhoz billentyűparancs is társítható. A billentyűparancsok lehetővé teszik a felhasználók számára, hogy billentyűkombinációt lenyomva aktiváljanak egy billentyűparancsot. Az alkalmazások az IShellLink::SetHotkey metódussal állíthatják be a parancsikon billentyűparancsát, és az IShellLink::GetHotkey metódussal lekérhetik az aktuális billentyűparancsot.
Elemazonosítók és azonosítólisták
A Rendszerhéj objektumazonosítókat használ a Shell névterén belül. A Rendszerhéjban látható összes objektum (fájlok, könyvtárak, kiszolgálók, munkacsoportok stb.) egyedi azonosítókkal rendelkezik a szülőmappában lévő objektumok között. Ezeket az azonosítókat elemazonosítóknak nevezzük, és SHITEMID adattípussal rendelkeznek a Shtypes.h fejlécfájlban meghatározott módon. Az elemazonosító egy változó hosszúságú bájtfolyam, amely egy mappán belüli objektumot azonosító információkat tartalmaz. Az azonosító tartalmát és formátumát csak az elemazonosító létrehozója ismeri. A Rendszerhéj által használt elemazonosító egyetlen része az első két bájt, amely megadja az azonosító méretét.
Minden szülőmappa saját elemazonosítóval rendelkezik, amely azonosítja azt a saját szülőmappájában. Így minden Shell-objektum egyedileg azonosítható az elemazonosítók listájával. A szülőmappák megőrzik a benne található elemek azonosítóinak listáját. A lista ITEMIDLIST adattípussal rendelkezik. Az elemazonosító-listákat a Rendszerhéj lefoglalja, és továbbíthatja a Rendszerhéj-felületeken, például IShellFolder. Fontos megjegyezni, hogy az elemazonosítók listájában szereplő egyes azonosítók csak a szülőmappa kontextusában értelmezhetők.
Az alkalmazások az IShellLink::SetIDList metódussal állíthatják be a parancsikonok elemazonosítóinak listáját. Ez a módszer akkor hasznos, ha olyan objektumra állít be parancsikont, amely nem fájl, például nyomtató vagy lemezmeghajtó. Az alkalmazások az IShellLink::GetIDList metódussal lekérhetik a parancsikonok elemazonosítóinak listáját.
Shell-hivatkozások használata
Ez a szakasz példákat tartalmaz, amelyek bemutatják, hogyan hozhat létre és oldhat fel parancsikonokat egy Win32-alapú alkalmazásból. Ez a szakasz feltételezi, hogy ismeri a Win32, a C++ és az OLE COM programozást.
Parancsikon és mappahivatkozás létrehozása fájlhoz
Az alábbi példában található CreateLink mintafüggvény létrehoz egy parancsikont. A paraméterek között szerepel egy mutató a hivatkozni kívánt fájl nevére, egy mutató a létrehozott parancsikon nevére, és egy mutató a hivatkozás leírására. A leírás a "Parancsikon fájlnév" sztringből áll, ahol fájlnév a hivatkozni kívánt fájl neve.
Ha a CreateLink mintafüggvény használatával szeretne mappaparancsot létrehozni, hívja meg CoCreateInstance CLSID_FolderShortcut használatával CLSID_ShellLink helyett (CLSID_FolderShortcut támogatja az IShellLinket). Minden más kód ugyanaz marad.
Mivel a CreateLink meghívja a CoCreateInstance függvényt, a rendszer feltételezi, hogy a CoInitialize függvényt már meghívták. A CreateLink a IPersistFile felületet használja a parancsikon és az IShellLink felület mentéséhez a fájlnév és a leírás tárolásához.
// CreateLink - Uses the Shell's IShellLink and IPersistFile interfaces
// to create and store a shortcut to the specified object.
//
// Returns the result of calling the member functions of the interfaces.
//
// Parameters:
// lpszPathObj - Address of a buffer that contains the path of the object,
// including the file name.
// lpszPathLink - Address of a buffer that contains the path where the
// Shell link is to be stored, including the file name.
// lpszDesc - Address of a buffer that contains a description of the
// Shell link, stored in the Comment field of the link
// properties.
#include "stdafx.h"
#include "windows.h"
#include "winnls.h"
#include "shobjidl.h"
#include "objbase.h"
#include "objidl.h"
#include "shlguid.h"
HRESULT CreateLink(LPCWSTR lpszPathObj, LPCSTR lpszPathLink, LPCWSTR lpszDesc)
{
HRESULT hres;
IShellLink* psl;
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize
// has already been called.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
// Set the path to the shortcut target and add the description.
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
// Query IShellLink for the IPersistFile interface, used for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
// Ensure that the string is Unicode.
MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
// Add code here to check return value from MultiByteWideChar
// for success.
// Save the link by calling IPersistFile::Save.
hres = ppf->Save(wsz, TRUE);
ppf->Release();
}
psl->Release();
}
return hres;
Parancsikon feloldása
Előfordulhat, hogy egy alkalmazásnak hozzá kell férnie és módosítania kell egy korábban létrehozott parancsikont. Ezt a műveletet a parancsikon feloldásának nevezzük.
Az alábbi példában az alkalmazás által definiált ResolveIt függvény felold egy parancsikont. A paraméterek közé tartozik egy ablakfogópont, egy mutató a parancsikon elérési útjára, valamint egy puffer címe, amely megkapja az objektum új elérési útját. Az ablakfogantyú azonosítja a szülőablakot minden olyan üzenetmezőhöz, amelyet a Rendszerhéjnak meg kell jelenítenie. A Rendszerhéj például megjeleníthet egy üzenetmezőt, ha a hivatkozás nem tagolt adathordozón található, ha hálózati problémák lépnek fel, ha a felhasználónak hajlékonylemezt kell beszúrnia stb.
A ResolveIt függvény meghívja a CoCreateInstance függvényt, és feltételezi, hogy a CoInitialize függvény már meghívva lett. Vegye figyelembe, hogy a ResolveItnek az IPersistFile felületet kell használnia a hivatkozásadatok tárolásához. IPersistFile az IShellLink objektum implementálja. A hivatkozásadatokat be kell tölteni az elérési út adatainak lekérése előtt, ami a példában később jelenik meg. Ha nem sikerül betölteni a hivatkozásadatokat, az iShellLink::GetPath és IShellLink::GetDescription tagfüggvények hívásai meghiúsulnak.
// ResolveIt - Uses the Shell's IShellLink and IPersistFile interfaces
// to retrieve the path and description from an existing shortcut.
//
// Returns the result of calling the member functions of the interfaces.
//
// Parameters:
// hwnd - A handle to the parent window. The Shell uses this window to
// display a dialog box if it needs to prompt the user for more
// information while resolving the link.
// lpszLinkFile - Address of a buffer that contains the path of the link,
// including the file name.
// lpszPath - Address of a buffer that receives the path of the link
target, including the file name.
// lpszDesc - Address of a buffer that receives the description of the
// Shell link, stored in the Comment field of the link
// properties.
#include "stdafx.h"
#include "windows.h"
#include "shobjidl.h"
#include "shlguid.h"
#include "strsafe.h"
HRESULT ResolveIt(HWND hwnd, LPCSTR lpszLinkFile, LPWSTR lpszPath, int iPathBufferSize)
{
HRESULT hres;
IShellLink* psl;
WCHAR szGotPath[MAX_PATH];
WCHAR szDescription[MAX_PATH];
WIN32_FIND_DATA wfd;
*lpszPath = 0; // Assume failure
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize
// has already been called.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
// Get a pointer to the IPersistFile interface.
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
// Ensure that the string is Unicode.
MultiByteToWideChar(CP_ACP, 0, lpszLinkFile, -1, wsz, MAX_PATH);
// Add code here to check return value from MultiByteWideChar
// for success.
// Load the shortcut.
hres = ppf->Load(wsz, STGM_READ);
if (SUCCEEDED(hres))
{
// Resolve the link.
hres = psl->Resolve(hwnd, 0);
if (SUCCEEDED(hres))
{
// Get the path to the link target.
hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH);
if (SUCCEEDED(hres))
{
// Get the description of the target.
hres = psl->GetDescription(szDescription, MAX_PATH);
if (SUCCEEDED(hres))
{
hres = StringCbCopy(lpszPath, iPathBufferSize, szGotPath);
if (SUCCEEDED(hres))
{
// Handle success
}
else
{
// Handle the error
}
}
}
}
}
// Release the pointer to the IPersistFile interface.
ppf->Release();
}
// Release the pointer to the IShellLink interface.
psl->Release();
}
return hres;
}
Parancsikon létrehozása nem fájlobjektumhoz
A nem fájlobjektumokhoz ( például nyomtatókhoz) mutató parancsikonok létrehozása hasonló a fájlra mutató parancsikon létrehozásához, azzal a kivételrel, hogy a fájl elérési útjának beállítása helyett az azonosítólistát a nyomtatóra kell állítania. Az azonosítólista beállításához hívja meg a IShellLink::SetIDList metódust egy azonosítólista címének megadásával.
A Rendszerhéj névterében minden objektum rendelkezik elemazonosítóval. A Rendszerhéj gyakran összefűzi az elemazonosítókat null értékű listákba, amelyek tetszőleges számú elemazonosítóból állnak. További információ az elemazonosítókról: Elemazonosítók és azonosítólisták.
Általánosságban elmondható, hogy ha olyan elemre kell parancsikont beállítania, amely nem rendelkezik fájlnévvel( például nyomtatóval), akkor már rendelkezik egy mutatóval az objektum IShellFolder felületére. IShellFolder névtérbővítmények létrehozásához használható.
Miután megkapta IShellFolderosztályazonosítóját, meghívhatja a CoCreateInstance függvényt a felület címének lekéréséhez. Ezután meghívhatja a felületet a mappában lévő objektumok számbavételéhez, és lekérheti a keresett objektum elemazonosítójának címét. Végül használhatja a címet az IShellLink::SetIDList tagfüggvény hívásában az objektum parancsikonjának létrehozásához.