Gränssnittslänkar
En Shell-länk är ett dataobjekt som innehåller information som används för att komma åt ett annat objekt i Shells namnområde, dvs. alla objekt som visas via Utforskaren. De typer av objekt som kan nås via Shell-länkar är filer, mappar, diskenheter och skrivare. Med en Shell-länk kan en användare eller ett program komma åt ett objekt var som helst i namnområdet. Användaren eller programmet behöver inte känna till objektets aktuella namn och plats.
Om Shell-länkar
Användaren skapar en Shell-länk genom att välja kommandot Skapa genväg från ett objekts snabbmeny. Systemet skapar automatiskt en ikon för Shell-länken genom att kombinera objektets ikon med en liten pil (kallas för den systemdefinierade länköverläggsikonen) som visas i ikonens nedre vänstra hörn. En Shell-länk som har en ikon kallas för en genväg. Men termerna Shell-länk och genväg används ofta omväxlande. Normalt skapar användaren genvägar för att få snabb åtkomst till objekt som lagras i undermappar eller i delade mappar på andra datorer. En användare kan till exempel skapa en genväg till ett Microsoft Word-dokument som finns i en undermapp och placera genvägsikonen på skrivbordet. Användaren kan sedan öppna dokumentet genom att dubbelklicka på genvägsikonen. Om dokumentet flyttas eller byter namn när genvägen har skapats försöker systemet uppdatera genvägen nästa gång användaren väljer det.
Program kan också skapa och använda Shell-länkar och genvägar. Ett ordbehandlingsprogram kan till exempel skapa en Shell-länk för att implementera en lista över de senast använda dokumenten. Ett program skapar en Shell-länk med hjälp av gränssnittet IShellLink för att skapa ett Shell-länkobjekt. Programmet använder gränssnittet IPersistFile eller IPersistStream för att lagra objektet i en fil eller dataström.
Not
Du kan inte använda IShellLink- för att skapa en länk till en URL.
Den här översikten beskriver gränssnittet IShellLink och förklarar hur du använder det för att skapa och lösa Shell-länkar från ett Microsoft Win32-baserat program. Eftersom designen av Shell-länkar baseras på OLE-komponentobjektmodellen (COM) bör du känna till de grundläggande begreppen i COM- och OLE-programmering innan du läser den här översikten.
Länkmatchning
Om en användare skapar en genväg till ett objekt och namnet eller platsen för objektet senare ändras, vidtar systemet automatiskt åtgärder för att uppdatera eller lösa genvägen nästa gång användaren väljer det. Men om ett program skapar en Shell-länk och lagrar den i en dataström försöker systemet inte automatiskt lösa länken. Programmet måste matcha länken genom att anropa metoden IShellLink::Resolve.
När en Shell-länk skapas sparar systemet information om länken. När du löser en länk – antingen automatiskt eller med en IShellLink::Lös-anrop – hämtar systemet först sökvägen som är associerad med Shell-länken med hjälp av en pekare till Shell-länkens identifierarlista. Mer information om listan över identifierare finns i objektidentifierare och identifierarlistor. Systemet söker efter det associerade objektet i sökvägen och löser länken om det hittar objektet. Om systemet inte kan hitta objektet anropas tjänsten DLT-tjänsten (Distributed Link Tracking) och Object Identifiers (DLT) för att hitta objektet. Om DLT-tjänsten inte är tillgänglig eller inte kan hitta objektet söker systemet i samma katalog efter ett objekt med samma tid och attribut för filskapande men med ett annat namn. Den här typen av sökning löser en länk till ett objekt som har bytt namn.
Om systemet fortfarande inte kan hitta objektet söker det igenom katalogerna, skrivbordet och lokala volymer och söker rekursivt genom katalogträdet efter ett objekt med antingen samma namn eller skapandetid. Om systemet fortfarande inte hittar någon matchning visas en dialogruta där användaren uppmanas att ange en plats. Ett program kan utelämna dialogrutan genom att ange värdet SLR_NO_UI i ett anrop till IShellLink::Lös.
Initiering av komponentobjektbiblioteket
Innan ett program kan skapa och lösa genvägar måste det initiera komponentobjektbiblioteket genom att anropa funktionen CoInitialize. Varje anrop till CoInitialize kräver ett motsvarande anrop till funktionen CoUninitialize, som ett program ska anropa när det avslutas. Anropet till CoUninitialize säkerställer att programmet inte avslutas förrän det har tagit emot alla väntande meddelanden.
Location-Independent namn
Systemet tillhandahåller platsoberoende namn för Shell-länkar till objekt som lagras i delade mappar. Om objektet lagras lokalt tillhandahåller systemet den lokala sökvägen och filnamnet för objektet. Om objektet lagras via fjärranslutning tillhandahåller systemet ett UNC-nätverksresursnamn (Universal Naming Convention) för objektet. Eftersom systemet tillhandahåller platsoberoende namn kan en Shell-länk fungera som ett universellt namn för en fil som kan överföras till andra datorer.
Länka filer
När användaren skapar en genväg till ett objekt genom att välja kommandot Skapa genväg från objektets snabbmeny, lagrar Windows den information som krävs för att komma åt objektet i en länkfil – en binär fil som har filnamnstillägget .lnk. En länkfil innehåller följande information:
- Platsen (sökvägen) för objektet som refereras till av genvägen (kallas motsvarande objekt).
- Arbetskatalogen för motsvarande objekt.
- Listan över argument som systemet skickar till motsvarande objekt när metoden IContextMenu::InvokeCommand aktiveras för genvägen.
- Show-kommandot som används för att ange det inledande visningstillståndet för motsvarande objekt. Det här är ett av de SW_ värden som beskrivs i ShowWindow.
- Platsen (sökväg och index) för genvägsikonen.
- Genvägens beskrivningssträng.
- Kortkommandot för genvägen.
När en länkfil tas bort påverkas inte motsvarande objekt.
Om du skapar en genväg till en annan genväg kopierar systemet bara länkfilen i stället för att skapa en ny länkfil. I det här fallet är genvägarna inte oberoende av varandra.
Ett program kan registrera ett filnamnstillägg som en genvägsfiltyp. Om en fil har ett filnamnstillägg som har registrerats som en genvägsfiltyp lägger systemet automatiskt till den systemdefinierade länköverläggsikonen (en liten pil) till filens ikon. Om du vill registrera ett filnamnstillägg som en genvägsfiltyp måste du lägga till värdet IsShortcut i registerbeskrivningen för filnamnstillägget, som du ser i exemplet nedan. Observera att gränssnittet måste startas om för att överläggsikonen ska börja gälla. IsShortcut har inget datavärde.
HKEY_CLASSES_ROOT
.xyz
(Default) = XYZApp
XYZApp
IsShortcut
Genvägsnamn
Genvägens namn, som är en sträng som visas under shell-länkikonen, är faktiskt själva genvägens filnamn. Användaren kan redigera beskrivningssträngen genom att välja den och ange en ny sträng.
Plats för genvägar i namnområdet
Det kan finnas en genväg på skrivbordet eller var som helst i Shells namnområde. På samma sätt kan objektet som är associerat med genvägen också finnas var som helst i Shells namnområde. Ett program kan använda metoden IShellLink::SetPath för att ange sökvägen och filnamnet för det associerade objektet och metoden IShellLink::GetPath för att hämta objektets aktuella sökväg och filnamn.
Arbetskatalog för genväg
Arbetskatalogen är den katalog där motsvarande objekt i en genväg läser in eller lagrar filer när användaren inte identifierar en specifik katalog. En länkfil innehåller namnet på arbetskatalogen för motsvarande objekt. Ett program kan ange namnet på arbetskatalogen för motsvarande objekt med hjälp av metoden IShellLink::SetWorkingDirectory och kan hämta namnet på den aktuella arbetskatalogen för motsvarande objekt med hjälp av metoden IShellLink::GetWorkingDirectory.
Kommandoradsargument för genväg
En länkfil innehåller kommandoradsargument som gränssnittet skickar till motsvarande objekt när användaren väljer länken. Ett program kan ange kommandoradsargumenten för en genväg med hjälp av metoden IShellLink::SetArguments. Det är användbart att ange kommandoradsargument när motsvarande program, till exempel en länkare eller kompilator, tar särskilda flaggor som argument. Ett program kan hämta kommandoradsargumenten från en genväg med hjälp av metoden IShellLink::GetArguments.
Kommandon för genvägsvisning
När användaren dubbelklickar på en genväg startar systemet programmet som är associerat med motsvarande objekt och anger programmets inledande visningstillstånd baserat på visningskommandot som anges av genvägen. Show-kommandot kan vara något av de SW_ värden som ingår i beskrivningen av funktionen ShowWindow. Ett program kan ange visningskommandot för en genväg med hjälp av metoden IShellLink::SetShowCmd och kan hämta det aktuella visningskommandot med hjälp av metoden IShellLink::GetShowCmd.
Genvägsikoner
Precis som andra Shell-objekt har en genväg en ikon. Användaren kommer åt objektet som är associerat med en genväg genom att dubbelklicka på genvägsikonen. När systemet skapar en ikon för en genväg använder det bitmappen för motsvarande objekt och lägger till den systemdefinierade länköverläggsikonen (en liten pil) i det nedre vänstra hörnet. Ett program kan ange platsen (sökväg och index) för en genvägsikon med hjälp av metoden IShellLink::SetIconLocation. Ett program kan hämta den här platsen med hjälp av metoden IShellLink::GetIconLocation.
Genvägsbeskrivningar
Genvägar har beskrivningar, men användaren ser dem aldrig. Ett program kan använda en beskrivning för att lagra all textinformation. Beskrivningar anges med metoden IShellLink::SetDescription och hämtas med metoden IShellLink::GetDescription.
Kortkommandon för kortkommandon
Ett genvägsobjekt kan ha ett kortkommando associerat med det. Med kortkommandon kan en användare trycka på en kombination av nycklar för att aktivera en genväg. Ett program kan ange kortkommandot för en genväg med hjälp av metoden IShellLink::SetHotkey och kan hämta den aktuella kortkommandot med hjälp av metoden IShellLink::GetHotkey.
Objektidentifierare och identifierarlistor
Shell använder objektidentifierare i Shells namnområde. Alla objekt som visas i gränssnittet (filer, kataloger, servrar, arbetsgrupper och så vidare) har unika identifierare bland objekten i den överordnade mappen. Dessa identifierare kallas objektidentifierare och de har SHITEMID datatyp enligt definitionen i shtypes.h-huvudfilen. En objektidentifierare är en byteström med variabel längd som innehåller information som identifierar ett objekt i en mapp. Endast skaparen av en objektidentifierare känner till innehållet och formatet för identifieraren. Den enda delen av en objektidentifierare som shell använder är de två första byteen, som anger storleken på identifieraren.
Varje överordnad mapp har en egen objektidentifierare som identifierar den i en egen överordnad mapp. Därför kan alla Shell-objekt identifieras unikt av en lista över objektidentifierare. En överordnad mapp behåller en lista med identifierare för de objekt som den innehåller. Listan har datatypen ITEMIDLIST. Objektidentifierarlistor allokeras av gränssnittet och kan skickas över Shell-gränssnitt, till exempel IShellFolder. Det är viktigt att komma ihåg att varje identifierare i en objektidentifierarlista bara är meningsfull inom ramen för den överordnade mappen.
Ett program kan ange en lista över objektidentifierare för en genväg med hjälp av metoden IShellLink::SetIDList. Den här metoden är användbar när du anger en genväg till ett objekt som inte är en fil, till exempel en skrivare eller diskenhet. Ett program kan hämta en genvägs objektidentifierarlista med hjälp av metoden IShellLink::GetIDList.
Använda Shell-länkar
Det här avsnittet innehåller exempel som visar hur du skapar och löser genvägar inifrån ett Win32-baserat program. Det här avsnittet förutsätter att du är bekant med Win32-, C++- och OLE COM-programmering.
Skapa en genväg och en mappgenväg till en fil
Exempelfunktionen CreateLink i följande exempel skapar en genväg. Parametrarna innehåller en pekare till namnet på filen som ska länkas till, en pekare till namnet på genvägen som du skapar och en pekare till länkens beskrivning. Beskrivningen består av strängen "Genväg till filnamn", där filnamn är namnet på filen som du vill länka till.
Om du vill skapa en mappgenväg med hjälp av exempelfunktionen CreateLink anropar du CoCreateInstance- med hjälp av CLSID_FolderShortcut i stället för CLSID_ShellLink (CLSID_FolderShortcut stöder IShellLink). All annan kod förblir densamma.
Eftersom CreateLink anropar funktionen CoCreateInstance antas det att funktionen CoInitialize redan har anropats. CreateLink använder gränssnittet IPersistFile för att spara genvägen och gränssnittet IShellLink för att lagra filnamnet och beskrivningen.
// 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;
Lösa en genväg
Ett program kan behöva komma åt och ändra en genväg som skapades tidigare. Den här åtgärden kallas för att matcha genvägen.
Den programdefinierade ResolveIt-funktionen i följande exempel löser en genväg. Parametrarna innehåller ett fönsterhandtag, en pekare till genvägens sökväg och adressen till en buffert som tar emot den nya sökvägen till objektet. Fönsterhandtaget identifierar det överordnade fönstret för alla meddelanderutor som Shell kan behöva visa. Gränssnittet kan till exempel visa en meddelanderuta om länken finns på odelade medier, om nätverksproblem uppstår, om användaren behöver infoga en diskett och så vidare.
Funktionen ResolveIt anropar funktionen CoCreateInstance och förutsätter att funktionen CoInitialize redan har anropats. Observera att ResolveIt måste använda gränssnittet IPersistFile för att lagra länkinformationen. IPersistFile implementeras av objektet IShellLink. Länkinformationen måste läsas in innan sökvägsinformationen hämtas, vilket visas senare i exemplet. Om du inte läser in länkinformationen misslyckas anropen till IShellLink::GetPath och IShellLink::GetDescription medlemsfunktioner.
// 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;
}
Skapa en genväg till ett icke-filobjekt
Att skapa en genväg till ett icke-filobjekt, till exempel en skrivare, liknar att skapa en genväg till en fil, förutom att du i stället för att ange sökvägen till filen måste ange identifierarlistan till skrivaren. Om du vill ange identifierarlistan anropar du metoden IShellLink::SetIDList och anger adressen till en identifierarlista.
Varje objekt i Shells namnområde har en objektidentifierare. Shell sammanfogar ofta objektidentifierare till null-avslutade listor som består av valfritt antal objektidentifierare. Mer information om objektidentifierare finns i objektidentifierare och identifierarlistor.
Om du behöver ange en genväg till ett objekt som inte har ett filnamn, till exempel en skrivare, har du i allmänhet redan en pekare till objektets IShellFolder- gränssnitt. IShellFolder- används för att skapa namnområdestillägg.
När du har klassidentifieraren för IShellFolderkan du anropa funktionen CoCreateInstance för att hämta adressen till gränssnittet. Sedan kan du anropa gränssnittet för att räkna upp objekten i mappen och hämta adressen till objektidentifieraren för det objekt som du söker efter. Slutligen kan du använda adressen i ett anrop till funktionen IShellLink::SetIDList medlem för att skapa en genväg till objektet.