Delen via


Shell-koppelingen

Een Shell-koppeling is een gegevensobject dat informatie bevat die wordt gebruikt voor toegang tot een ander object in de naamruimte van de Shell, dat wil gezegd, elk object dat zichtbaar is via Windows Verkenner. De typen objecten die kunnen worden geopend via Shell-koppelingen zijn bestanden, mappen, schijfstations en printers. Met een Shell-koppeling kan een gebruiker of toepassing vanaf elke locatie in de naamruimte toegang krijgen tot een object. De gebruiker of toepassing hoeft de huidige naam en locatie van het object niet te weten.

De gebruiker maakt een Shell-koppeling door de Snelkoppeling maken opdracht te kiezen in het snelmenu van een object. Het systeem maakt automatisch een pictogram voor de Shell-koppeling door het objectpictogram te combineren met een kleine pijl (ook wel het door het systeem gedefinieerde koppeling-overlaypictogram genoemd) dat in de linkerbenedenhoek van het pictogram wordt weergegeven. Een Shell-koppeling met een pictogram wordt een snelkoppeling genoemd; de termen Shell-koppeling en snelkoppeling worden echter vaak door elkaar gebruikt. Normaal gesproken maakt de gebruiker snelkoppelingen om snelle toegang te krijgen tot objecten die zijn opgeslagen in submappen of in gedeelde mappen op andere computers. Een gebruiker kan bijvoorbeeld een snelkoppeling maken naar een Microsoft Word-document dat zich in een submap bevindt en het snelkoppelingspictogram op het bureaublad plaatst. De gebruiker kan het document vervolgens openen door te dubbelklikken op het snelkoppelingspictogram. Als het document wordt verplaatst of een andere naam krijgt nadat de snelkoppeling is gemaakt, probeert het systeem de snelkoppeling bij te werken wanneer de gebruiker het de volgende keer selecteert.

Toepassingen kunnen ook Shell-koppelingen en -snelkoppelingen maken en gebruiken. Een tekstverwerkingstoepassing kan bijvoorbeeld een Shell-koppeling maken om een lijst met de laatst gebruikte documenten te implementeren. Een toepassing maakt een Shell-koppeling met behulp van de IShellLink interface om een Shell-koppelingsobject te maken. De toepassing maakt gebruik van de interface IPersistFile of IPersistStream om het object in een bestand of stream op te slaan.

Notitie

U kunt IShellLink- niet gebruiken om een koppeling naar een URL te maken.

 

In dit overzicht wordt de IShellLink-interface beschreven en wordt uitgelegd hoe u deze kunt gebruiken om Shell-koppelingen te maken en op te lossen vanuit een Microsoft Win32-toepassing. Omdat het ontwerp van Shell-koppelingen is gebaseerd op het OLE Component Object Model (COM), moet u bekend zijn met de basisconcepten van COM en OLE-programmering voordat u dit overzicht leest.

Als een gebruiker een snelkoppeling naar een object maakt en de naam of locatie van het object later wordt gewijzigd, voert het systeem automatisch stappen uit om de snelkoppeling bij te werken of op te lossen wanneer de gebruiker deze de volgende keer selecteert. Als een toepassing echter een Shell-koppeling maakt en opslaat in een stream, probeert het systeem de koppeling niet automatisch op te lossen. De toepassing moet de koppeling oplossen door de methode IShellLink::Resolve aan te roepen.

Wanneer er een Shell-koppeling wordt gemaakt, slaat het systeem informatie over de koppeling op. Bij het omzetten van een koppeling( automatisch of met een IShellLink::Resolve call) haalt het systeem eerst het pad op dat is gekoppeld aan de Shell-koppeling met behulp van een aanwijzer naar de id-lijst van de Shell-koppeling. Zie item-id's en id-lijstenvoor meer informatie over de lijst met id's. Het systeem zoekt naar het bijbehorende object in dat pad en, als het object wordt gevonden, wordt de koppeling omgezet. Als het systeem het object niet kan vinden, wordt het aangeroepen voor de service Distributed Link Tracking and Object Identifiers (DLT), indien beschikbaar, om het object te vinden. Als de DLT-service niet beschikbaar is of het object niet kan vinden, zoekt het systeem in dezelfde map naar een object met dezelfde tijd en kenmerken voor het maken van bestanden, maar met een andere naam. Met dit type zoekopdracht wordt een koppeling omgezet naar een object waarvan de naam is gewijzigd.

Als het systeem het object nog steeds niet kan vinden, doorzoekt het de mappen, het bureaublad en de lokale volumes, die recursief worden weergegeven in de mapstructuur voor een object met dezelfde naam of maaktijd. Als het systeem nog steeds geen overeenkomst vindt, wordt er een dialoogvenster weergegeven waarin de gebruiker om een locatie wordt gevraagd. Een toepassing kan het dialoogvenster onderdrukken door de SLR_NO_UI waarde op te geven in een aanroep naar IShellLink::Resolve.

Initialisatie van de componentobjectbibliotheek

Voordat een toepassing snelkoppelingen kan maken en oplossen, moet deze de objectbibliotheek van het onderdeel initialiseren door de functie CoInitialize aan te roepen. Elke aanroep van CoInitialize- vereist een bijbehorende aanroep naar de CoUninitialize-functie, die een toepassing moet aanroepen wanneer deze wordt beëindigd. De aanroep van CoUninitialize zorgt ervoor dat de toepassing pas wordt beëindigd nadat alle berichten in behandeling zijn ontvangen.

Location-Independent namen

Het systeem biedt locatie-onafhankelijke namen voor Shell-koppelingen naar objecten die zijn opgeslagen in gedeelde mappen. Als het object lokaal is opgeslagen, geeft het systeem het lokale pad en de bestandsnaam voor het object op. Als het object extern wordt opgeslagen, biedt het systeem een UNC-netwerkresourcenaam (Universal Naming Convention) voor het object. Omdat het systeem locatie-onafhankelijke namen biedt, kan een Shell-koppeling fungeren als een universele naam voor een bestand dat kan worden overgebracht naar andere computers.

Wanneer de gebruiker een snelkoppeling naar een object maakt door de opdracht Snelkoppeling maken te kiezen in het snelmenu van het object, worden de gegevens opgeslagen die nodig zijn voor toegang tot het object in een koppelingsbestand, een binair bestand met de bestandsextensie .lnk. Een koppelingsbestand bevat de volgende informatie:

  • De locatie (pad) van het object waarnaar wordt verwezen door de snelkoppeling (het bijbehorende object genoemd).
  • De werkmap van het bijbehorende object.
  • De lijst met argumenten die het systeem doorgeeft aan het bijbehorende object wanneer de methode IContextMenu::InvokeCommand wordt geactiveerd voor de snelkoppeling.
  • De opdracht show die wordt gebruikt om de initiële weergavestatus van het bijbehorende object in te stellen. Dit is een van de SW_ waarden die worden beschreven in ShowWindow-.
  • De locatie (pad en index) van het snelkoppelingspictogram.
  • De beschrijvingstekenreeks van de snelkoppeling.
  • De sneltoets voor de sneltoets.

Wanneer een koppelingsbestand wordt verwijderd, wordt het bijbehorende object niet beïnvloed.

Als u een snelkoppeling naar een andere snelkoppeling maakt, kopieert het systeem het koppelingsbestand in plaats van een nieuw koppelingsbestand te maken. In dit geval zijn de sneltoetsen niet onafhankelijk van elkaar.

Een toepassing kan een bestandsnaamextensie registreren als een snelkoppelingsbestandstype. Als een bestand een bestandsnaamextensie heeft die is geregistreerd als een snelkoppelingsbestandstype, wordt het door het systeem gedefinieerde koppelingsoverlaypictogram (een kleine pijl) automatisch toegevoegd aan het pictogram van het bestand. Als u een bestandsnaamextensie wilt registreren als een snelkoppelingsbestandstype, moet u de isShortcut-waarde toevoegen aan de registerbeschrijving van de bestandsnaamextensie, zoals wordt weergegeven in het onderstaande voorbeeld. Houd er rekening mee dat de Shell opnieuw moet worden gestart om het overlaypictogram van kracht te laten worden. IsShortcut heeft geen gegevenswaarde.

HKEY_CLASSES_ROOT
   .xyz
      (Default) = XYZApp
   XYZApp
      IsShortcut

Snelkoppelingsnamen

De naam van de snelkoppeling, een tekenreeks die onder het shell-koppelingspictogram wordt weergegeven, is eigenlijk de bestandsnaam van de snelkoppeling zelf. De gebruiker kan de beschrijvingsreeks bewerken door deze te selecteren en een nieuwe tekenreeks in te voeren.

Locatie van snelkoppelingen in de naamruimte

Er kan een snelkoppeling aanwezig zijn op het bureaublad of ergens in de naamruimte van de Shell. Op dezelfde manier kan het object dat is gekoppeld aan de snelkoppeling ook ergens in de naamruimte van de Shell bestaan. Een toepassing kan de methode IShellLink::SetPath gebruiken om het pad en de bestandsnaam voor het gekoppelde object in te stellen en de methode IShellLink::GetPath om het huidige pad en de bestandsnaam voor het object op te halen.

Werkmap snelkoppeling

De werkmap is de map waarin het bijbehorende object van een snelkoppeling bestanden laadt of opslaat wanneer de gebruiker geen specifieke map identificeert. Een koppelingsbestand bevat de naam van de werkmap voor het bijbehorende object. Een toepassing kan de naam van de werkmap voor het bijbehorende object instellen met behulp van de methode IShellLink::SetWorkingDirectory en kan de naam van de huidige werkmap voor het bijbehorende object ophalen met behulp van de methode IShellLink::GetWorkingDirectory methode.

Opdrachtregelargumenten voor snelkoppelingen

Een koppelingsbestand bevat opdrachtregelargumenten die de Shell doorgeeft aan het bijbehorende object wanneer de gebruiker de koppeling selecteert. Een toepassing kan de opdrachtregelargumenten voor een snelkoppeling instellen met behulp van de methode IShellLink::SetArguments. Het is handig om opdrachtregelargumenten in te stellen wanneer de bijbehorende toepassing, zoals een linker of compiler, speciale vlaggen als argumenten gebruikt. Een toepassing kan de opdrachtregelargumenten ophalen uit een snelkoppeling met behulp van de methode IShellLink::GetArguments methode.

Opdrachten voor snelkoppelingen weergeven

Wanneer de gebruiker dubbelklikt op een snelkoppeling, start het systeem de toepassing die is gekoppeld aan het bijbehorende object en stelt de initiële weergavestatus van de toepassing in op basis van de showopdracht die is opgegeven door de snelkoppeling. De opdracht Show kan een van de SW_ waarden zijn die zijn opgenomen in de beschrijving van de functie ShowWindow. Een toepassing kan de opdracht show voor een snelkoppeling instellen met behulp van de methode IShellLink::SetShowCmd en kan de opdracht huidige voorstelling ophalen met behulp van de methode IShellLink::GetShowCmd.

Snelkoppelingspictogrammen

Net als andere Shell-objecten heeft een snelkoppeling een pictogram. De gebruiker opent het object dat is gekoppeld aan een snelkoppeling door te dubbelklikken op het pictogram van de snelkoppeling. Wanneer het systeem een pictogram voor een snelkoppeling maakt, wordt de bitmap van het bijbehorende object gebruikt en wordt het door het systeem gedefinieerde koppelingsoverlaypictogram (een kleine pijl) toegevoegd aan de linkerbenedenhoek. Een toepassing kan de locatie (pad en index) van een snelkoppelingspictogram instellen met behulp van de methode IShellLink::SetIconLocation. Een toepassing kan deze locatie ophalen met behulp van de methode IShellLink::GetIconLocation.

Beschrijvingen van snelkoppelingen

Snelkoppelingen hebben beschrijvingen, maar de gebruiker ziet ze nooit. Een toepassing kan een beschrijving gebruiken om tekstgegevens op te slaan. Beschrijvingen worden ingesteld met behulp van de methode IShellLink::SetDescription en opgehaald met behulp van de methode IShellLink::GetDescription.

Sneltoetsen

Aan een sneltoetsobject kan een sneltoets zijn gekoppeld. Met sneltoetsen kan een gebruiker op een combinatie van toetsen drukken om een snelkoppeling te activeren. Een toepassing kan de sneltoets voor een snelkoppeling instellen met behulp van de methode IShellLink::SetHotkey en kan de huidige sneltoets ophalen met behulp van de methode IShellLink::GetHotkey.

Item-id's en id-lijsten

De Shell maakt gebruik van object-id's in de naamruimte van de Shell. Alle objecten die zichtbaar zijn in de Shell (bestanden, mappen, servers, werkgroepen enzovoort) hebben unieke id's tussen de objecten in de bovenliggende map. Deze id's worden item-id's genoemd en ze hebben het SHITEMID- gegevenstype zoals gedefinieerd in het headerbestand Shtypes.h. Een item-id is een bytestroom met variabele lengte die informatie bevat die een object in een map identificeert. Alleen de maker van een item-id kent de inhoud en indeling van de id. Het enige deel van een item-id die door Shell wordt gebruikt, is de eerste twee bytes, waarmee de grootte van de id wordt opgegeven.

Elke bovenliggende map heeft een eigen item-id die deze identificeert in een eigen bovenliggende map. Elk Shell-object kan dus uniek worden geïdentificeerd door een lijst met item-id's. Een bovenliggende map bewaart een lijst met id's voor de items die deze bevat. De lijst bevat de ITEMIDLIST gegevenstype. Item-id-lijsten worden toegewezen door de Shell en kunnen worden doorgegeven via Shell-interfaces, zoals IShellFolder. Het is belangrijk te onthouden dat elke id in een item-id-lijst alleen zinvol is binnen de context van de bovenliggende map.

Een toepassing kan een lijst met item-id's van een snelkoppeling instellen met behulp van de methode IShellLink::SetIDList. Deze methode is handig bij het instellen van een snelkoppeling naar een object dat geen bestand is, zoals een printer of schijfstation. Een toepassing kan de lijst met item-id's van een snelkoppeling ophalen met behulp van de methode IShellLink::GetIDList.

Deze sectie bevat voorbeelden die laten zien hoe u snelkoppelingen maakt en oplost vanuit een Win32-toepassing. In deze sectie wordt ervan uitgegaan dat u bekend bent met Win32-, C++- en OLE COM-programmering.

Een snelkoppeling en een snelkoppeling naar een bestand maken

Met de voorbeeldfunctie CreateLink in het volgende voorbeeld wordt een snelkoppeling gemaakt. De parameters bevatten een aanwijzer naar de naam van het bestand waarnaar u een koppeling wilt maken, een aanwijzer naar de naam van de snelkoppeling die u maakt en een aanwijzer naar de beschrijving van de koppeling. De beschrijving bestaat uit de tekenreeks 'Snelkoppeling naar bestandsnaam', waarbij bestandsnaam de naam is van het bestand waarnaar u een koppeling wilt maken.

Als u een snelkoppeling naar een map wilt maken met de voorbeeldfunctie CreateLink, roept u CoCreateInstance- aan met behulp van CLSID_FolderShortcut in plaats van CLSID_ShellLink (CLSID_FolderShortcut ondersteunt IShellLink). Alle andere code blijft hetzelfde.

Omdat CreateLink de functie CoCreateInstance aanroept, wordt ervan uitgegaan dat de functie CoInitialize al is aangeroepen. CreateLink maakt gebruik van de interface IPersistFile om de snelkoppeling en de interface IShellLink op te slaan om de bestandsnaam en beschrijving op te slaan.

// 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; 

Een snelkoppeling oplossen

Een toepassing moet mogelijk een snelkoppeling openen en bewerken die eerder is gemaakt. Deze bewerking wordt aangeduid als het omzetten van de snelkoppeling.

De toepassingsgedefinieerde ResolveIt-functie in het volgende voorbeeld lost een snelkoppeling op. De parameters bevatten een venstergreep, een aanwijzer naar het pad van de snelkoppeling en het adres van een buffer die het nieuwe pad naar het object ontvangt. De venstergreep identificeert het bovenliggende venster voor alle berichtvakken die de Shell mogelijk moet weergeven. De Shell kan bijvoorbeeld een berichtvak weergeven als de koppeling zich op niet-gedeelde media bevindt, als er netwerkproblemen optreden, als de gebruiker een diskette moet invoegen, enzovoort.

Met de functie ResolveIt wordt de functie CoCreateInstance aangeroepen en wordt ervan uitgegaan dat de functie CoInitialize al is aangeroepen. Houd er rekening mee dat ResolveIt de IPersistFile interface moet gebruiken om de koppelingsgegevens op te slaan. IPersistFile wordt geïmplementeerd door het IShellLink-object. De koppelingsgegevens moeten worden geladen voordat de padinformatie wordt opgehaald, die verderop in het voorbeeld wordt weergegeven. Als de koppelingsgegevens niet worden geladen, worden de aanroepen naar de IShellLink::GetPath- en IShellLink::GetDescription lidfuncties mislukt.

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

Een snelkoppeling maken naar een niet-bestandsobject

Het maken van een snelkoppeling naar een niet-bestandobject, zoals een printer, is vergelijkbaar met het maken van een snelkoppeling naar een bestand, behalve dat in plaats van het pad naar het bestand in te stellen, u de id-lijst moet instellen op de printer. Als u de id-lijst wilt instellen, roept u de methode IShellLink::SetIDList aan en geeft u het adres van een id-lijst op.

Elk object in de naamruimte van de Shell heeft een item-id. De Shell voegt vaak item-id's samen in null-beëindigde lijsten die bestaan uit een willekeurig aantal item-id's. Zie item-id's en id-lijstenvoor meer informatie over item-id's.

Als u in het algemeen een snelkoppeling moet instellen op een item dat geen bestandsnaam heeft, zoals een printer, hebt u al een aanwijzer naar de IShellFolder interface van het object. IShellFolder- wordt gebruikt om naamruimteextensies te maken.

Zodra u de klasse-id voor IShellFolder-hebt, kunt u de functie CoCreateInstance aanroepen om het adres van de interface op te halen. Vervolgens kunt u de interface aanroepen om de objecten in de map op te sommen en het adres van de item-id op te halen voor het object waarnaar u zoekt. Ten slotte kunt u het adres in een aanroep naar de IShellLink::SetIDList lidfunctie gebruiken om een snelkoppeling naar het object te maken.