Sdílet prostřednictvím


Odkazy prostředí

Odkaz Shell je datový objekt, který obsahuje informace používané pro přístup k jinému objektu v oboru názvů prostředí – to znamená jakýkoli objekt viditelný prostřednictvím Průzkumníka Windows. Mezi typy objektů, ke kterým lze přistupovat prostřednictvím odkazů prostředí, patří soubory, složky, diskové jednotky a tiskárny. Odkaz prostředí umožňuje uživateli nebo aplikaci přistupovat k objektu odkudkoli v oboru názvů. Uživatel nebo aplikace nemusí znát aktuální název a umístění objektu.

Uživatel vytvoří odkaz prostředí výběrem příkazu Vytvořit zástupce z místní nabídky objektu. Systém automaticky vytvoří ikonu pro odkaz Prostředí tak, že zkombinuje ikonu objektu s malou šipkou (označovanou jako ikona překrytí odkazem definovaným systémem), která se zobrazí v levém dolním rohu ikony. Odkaz prostředí, který má ikonu, se nazývá zástupce; Termíny odkazu a zástupce prostředí se ale často používají zaměnitelně. Uživatel obvykle vytváří zástupce pro rychlý přístup k objektům uloženým v podsložkách nebo ve sdílených složkách na jiných počítačích. Uživatel může například vytvořit zástupce dokumentu Aplikace Microsoft Word, který je umístěn v podsložce, a umístit ikonu zástupce na plochu. Uživatel pak může dokument otevřít poklikáním na ikonu zástupce. Pokud se dokument po vytvoření zástupce přesune nebo přejmenuje, systém se pokusí aktualizovat zástupce při příštím výběru uživatelem.

Aplikace můžou také vytvářet a používat odkazy a klávesové zkratky prostředí. Aplikace pro zpracování textu může například vytvořit odkaz prostředí pro implementaci seznamu naposledy použitých dokumentů. Aplikace vytvoří odkaz prostředí pomocí rozhraní IShellLink k vytvoření objektu odkazu prostředí. Aplikace používá IPersistFile nebo IPersistStream rozhraní k uložení objektu do souboru nebo datového proudu.

Poznámka

K vytvoření odkazu na adresu URL nemůžete použít IShellLink.

 

Tento přehled popisuje rozhraní IShellLink a vysvětluje, jak ho použít k vytváření a řešení odkazů prostředí z aplikace založené na Microsoft Win32. Vzhledem k tomu, že návrh odkazů prostředí je založen na objektovém modelu OLE (COM), měli byste být obeznámeni se základními koncepty programování modelu COM a OLE před přečtením tohoto přehledu.

Pokud uživatel vytvoří zástupce objektu a název nebo umístění objektu se později změní, systém automaticky provede kroky aktualizace nebo vyřešení zástupce při příštím výběru uživatele. Pokud však aplikace vytvoří odkaz Prostředí a uloží ho do datového proudu, systém se automaticky nepokusí přeložit propojení. Aplikace musí tento odkaz vyřešit voláním metody IShellLink::Resolve.

Když se vytvoří odkaz prostředí, systém uloží informace o odkazu. Při překladu odkazu (buď automaticky, nebo pomocí IShellLink::Resolve volání) systém nejprve načte cestu přidruženou k odkazu Prostředí pomocí ukazatele na seznam identifikátorů odkazu prostředí. Další informace o seznamu identifikátorů naleznete v tématu Identifikátory položek a seznamy identifikátorů. Systém vyhledá přidružený objekt v této cestě a pokud najde objekt, přeloží odkaz. Pokud systém nemůže objekt najít, volá službu Distributed Link Tracking a Object Identifiers (DLT), aby objekt vyhlašoval. Pokud služba DLT není k dispozici nebo objekt nemůže najít, systém hledá ve stejném adresáři objekt se stejným časem vytvoření souboru a atributy, ale s jiným názvem. Tento typ hledání přeloží odkaz na přejmenovaný objekt.

Pokud systém objekt stále nemůže najít, prohledá adresáře, plochu a místní svazky a hledá rekurzivně i adresářový strom objektu se stejným názvem nebo časem vytvoření. Pokud systém stále nenajde shodu, zobrazí se dialogové okno s výzvou k zadání umístění uživatele. Aplikace může potlačit dialogové okno zadáním hodnoty SLR_NO_UI ve volání IShellLink::Resolve.

Inicializace knihovny objektů komponent

Než může aplikace vytvořit a přeložit zástupce, musí inicializovat knihovnu objektů komponenty voláním CoInitialize funkce. Každé volání CoInitialize vyžaduje odpovídající volání CoUninitialize funkce, kterou by měla aplikace volat při ukončení. Volání CoUninitialize zajišťuje, že aplikace se neukončuje, dokud neobdrží všechny čekající zprávy.

názvy Location-Independent

Systém poskytuje názvy nezávislé na umístění pro odkazy prostředí na objekty uložené ve sdílených složkách. Pokud je objekt uložen místně, systém poskytne místní cestu a název souboru objektu. Pokud je objekt uložen vzdáleně, poskytuje systém název síťového prostředku UNC (Universal Naming Convention). Vzhledem k tomu, že systém poskytuje názvy nezávislé na umístění, může odkaz prostředí sloužit jako univerzální název souboru, který lze přenést do jiných počítačů.

Když uživatel vytvoří zástupce objektu tak, že v místní nabídce objektu zvolí příkaz Vytvořit zástupce, systém Windows uloží informace, které potřebuje pro přístup k objektu v souboru odkazu – binární soubor s příponou názvu souboru .lnk. Soubor odkazu obsahuje následující informace:

  • Umístění (cesta) objektu, na který odkazuje zástupce (označovaný jako odpovídající objekt).
  • Pracovní adresář odpovídajícího objektu.
  • Seznam argumentů, které systém předává odpovídajícímu objektu při IContextMenu::InvokeCommand metoda je aktivována pro zástupce.
  • Příkaz show použitý k nastavení počátečního stavu zobrazení odpovídajícího objektu. Toto je jedna z SW_ hodnot popsaných v ShowWindow.
  • Umístění (cesta a index) ikony zástupce.
  • Řetězec popisu zástupce.
  • Klávesová zkratka pro klávesovou zkratku

Když se odstraní soubor odkazu, odpovídající objekt nebude ovlivněn.

Pokud vytvoříte zástupce jiného zástupce, systém jednoduše zkopíruje soubor odkazu místo vytvoření nového souboru odkazu. V takovém případě nebudou klávesové zkratky vzájemně nezávislé.

Aplikace může jako typ souboru zástupce zaregistrovat příponu názvu souboru. Pokud má soubor příponu názvu souboru, která byla zaregistrována jako typ souboru zástupce, systém automaticky přidá ikonu překrytí odkaz definovaný systémem (malou šipku) do ikony souboru. Chcete-li zaregistrovat příponu názvu souboru jako typ souboru zástupce, musíte přidat hodnotu IsShortcut do popisu registru přípony názvu souboru, jak je znázorněno v příkladu níže. Nezapomeňte, že prostředí se musí restartovat, aby se ikona překryvu projevila. IsShortcut nemá žádnou hodnotu dat.

HKEY_CLASSES_ROOT
   .xyz
      (Default) = XYZApp
   XYZApp
      IsShortcut

Názvy zástupců

Název zástupce, což je řetězec, který se zobrazí pod ikonou odkazu Prostředí, je ve skutečnosti název souboru samotného zástupce. Uživatel může upravit řetězec popisu tak, že ho vybere a zadá nový řetězec.

Umístění zástupců v oboru názvů

Zástupce může existovat na ploše nebo kdekoli v oboru názvů prostředí. Podobně objekt přidružený ke zástupce může existovat také kdekoli v oboru názvů prostředí. Aplikace může použít metodu IShellLink::SetPath k nastavení cesty a názvu souboru přidruženého objektu a IShellLink::GetPath metoda načtení aktuální cesty a názvu souboru objektu.

Pracovní adresář zástupce

Pracovní adresář je adresář, kde odpovídající objekt zástupce načte nebo ukládá soubory, když uživatel konkrétní adresář neidentifikuje. Soubor odkazu obsahuje název pracovního adresáře pro odpovídající objekt. Aplikace může nastavit název pracovního adresáře pro odpovídající objekt pomocí IShellLink::SetWorkingDirectory metoda a může načíst název aktuálního pracovního adresáře pro odpovídající objekt pomocí IShellLink::GetWorkingDirectory metoda.

Argumenty příkazového řádku zástupce

Soubor odkazu obsahuje argumenty příkazového řádku, které prostředí předá odpovídajícímu objektu, když uživatel vybere odkaz. Aplikace může pro zástupce nastavit argumenty příkazového řádku pomocí metody IShellLink::SetArguments. Argumenty příkazového řádku je užitečné nastavit v případě, že odpovídající aplikace, jako je linker nebo kompilátor, přebírá jako argumenty speciální příznaky. Aplikace může načíst argumenty příkazového řádku ze zástupce pomocí metody IShellLink::GetArguments.

Klávesové zkratky zobrazují příkazy

Když uživatel dvakrát klikne na zástupce, systém spustí aplikaci přidruženou k odpovídajícímu objektu a nastaví počáteční stav zobrazení aplikace na základě příkazu show určeného zástupcem. Příkaz show může být libovolný z SW_ hodnot zahrnutých v popisu funkce ShowWindow. Aplikace může nastavit příkaz show pro zástupce pomocí metody IShellLink::SetShowCmd a pomocí metody IShellLink::GetShowCmd načíst aktuální příkaz show.

Ikony zástupců

Stejně jako jiné objekty shellu má zástupce ikonu. Uživatel přistupuje k objektu přidruženému ke zkratce poklikáním na ikonu zástupce. Když systém vytvoří ikonu zástupce, použije rastrový obrázek odpovídajícího objektu a přidá ikonu překrytí propojení definovanou systémem (malou šipku) do levého dolního rohu. Aplikace může nastavit umístění (cestu a index) ikony zástupce pomocí metody IShellLink::SetIconLocation. Aplikace může načíst toto umístění pomocí metody IShellLink::GetIconLocation.

Popisy zástupců

Klávesové zkratky mají popisy, ale uživatel je nikdy neuvidí. Aplikace může použít popis k uložení veškerých textových informací. Popisy se nastavují pomocí metody IShellLink::SetDescription a načítají se pomocí metody IShellLink::GetDescription.

Klávesové zkratky

Objekt klávesové zkratky může mít přidruženou klávesovou zkratku. Klávesové zkratky umožňují uživateli stisknout kombinaci kláves pro aktivaci klávesové zkratky. Aplikace může nastavit klávesovou zkratku pro zástupce pomocí metody IShellLink::SetHotkey a pomocí metody IShellLink::GetHotkey načíst aktuální klávesovou zkratku.

Identifikátory položek a seznamy identifikátorů

Prostředí používá identifikátory objektů v oboru názvů prostředí. Všechny objekty viditelné v prostředí (soubory, adresáře, servery, pracovní skupiny atd.) mají jedinečné identifikátory mezi objekty v nadřazené složce. Tyto identifikátory se nazývají identifikátory položek a mají SHITEMID datový typ definovaný v souboru záhlaví Shtypes.h. Identifikátor položky je datový proud s proměnlivou délkou bajtu, který obsahuje informace, které identifikují objekt v rámci složky. Pouze tvůrce identifikátoru položky zná obsah a formát identifikátoru. Jediná část identifikátoru položky, kterou prostředí používá, je první dva bajty, které určují velikost identifikátoru.

Každá nadřazená složka má vlastní identifikátor položky, který ji identifikuje ve své vlastní nadřazené složce. Proto může být jakýkoli objekt Shell jednoznačně identifikován seznamem identifikátorů položek. Nadřazená složka uchovává seznam identifikátorů pro položky, které obsahuje. Seznam obsahuje datový typ ITEMIDLIST. Seznamy identifikátorů položek jsou přiděleny prostředím a mohou být předány napříč rozhraními prostředí, například IShellFolder. Je důležité si uvědomit, že každý identifikátor v seznamu identifikátorů položek je smysluplný pouze v kontextu nadřazené složky.

Aplikace může nastavit seznam identifikátorů položek zástupce pomocí metody IShellLink::SetIDList. Tato metoda je užitečná při nastavení zástupce objektu, který není soubor, například tiskárny nebo diskové jednotky. Aplikace může načíst seznam identifikátorů položek zástupce pomocí metody IShellLink::GetIDList.

Tato část obsahuje příklady, které ukazují, jak vytvářet a řešit zástupce z aplikace založené na Win32. V této části se předpokládá, že znáte programování win32, C++ a OLE COM.

Vytvoření zástupce a zástupce složky pro soubor

Ukázková funkce CreateLink v následujícím příkladu vytvoří zástupce. Parametry zahrnují ukazatel na název souboru, na který se má odkazovat, ukazatel na název zástupce, který vytváříte, a ukazatel na popis odkazu. Popis se skládá z řetězce "Zástupce název souboru", kde název souboru je název souboru, na který se má odkazovat.

Pokud chcete vytvořit zástupce složky pomocí ukázkové funkce CreateLink, zavolejte CoCreateInstance pomocí CLSID_FolderShortcut místo CLSID_ShellLink (CLSID_FolderShortcut podporuje IShellLink). Všechny ostatní kódy zůstávají stejné.

Protože CreateLink volá funkci CoCreateInstance, předpokládá se, že funkce CoInitialize již byla volána. CreateLink používá rozhraní IPersistFile k uložení zástupce a rozhraní IShellLink k uložení názvu a popisu souboru.

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

Řešení zástupce

Aplikace může potřebovat přístup k dříve vytvořenému zástupce a manipulaci s ním. Tato operace se označuje jako překlad zástupce.

Funkce ResolveIt definovaná aplikací v následujícím příkladu přeloží zástupce. Jeho parametry zahrnují popisovač okna, ukazatel na cestu zástupce a adresu vyrovnávací paměti, která přijímá novou cestu k objektu. Popisovač okna identifikuje nadřazené okno pro všechna pole zpráv, která může prostředí potřebovat zobrazit. Prostředí může například zobrazit okno se zprávou, pokud je odkaz na nesdílené médium, pokud dojde k problémům se sítí, pokud uživatel potřebuje vložit disketu atd.

Funkce ResolveIt volá funkci CoCreateInstance a předpokládá, že funkce CoInitialize již byla volána. Všimněte si, že ResolveIt musí k uložení informací o propojení použít rozhraní IPersistFile. IPersistFile je implementovaný objektem IShellLink. Informace o propojení musí být načteny před načtením informací o cestě, které jsou uvedeny dále v příkladu. Načtení informací o propojení způsobí selhání volání IShellLink::GetPath a IShellLink::GetDescription členské funkce.

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

Vytvoření zástupce objektu bez souboru

Vytvoření zástupce nesouborového objektu, například tiskárny, se podobá vytvoření zástupce souboru s tím rozdílem, že místo nastavení cesty k souboru je nutné nastavit seznam identifikátorů na tiskárnu. Chcete-li nastavit seznam identifikátorů, zavolejte IShellLink::SetIDList metoda určující adresu seznamu identifikátorů.

Každý objekt v oboru názvů prostředí má identifikátor položky. Prostředí často zřetězí identifikátory položek do seznamů ukončených hodnotou null, které se skládají z libovolného počtu identifikátorů položek. Další informace o identifikátorech položek naleznete v tématu identifikátory položek a seznamy identifikátorů.

Obecně platí, že pokud potřebujete nastavit zástupce položky, která nemá název souboru, například tiskárnu, budete již mít ukazatel na IShellFolder rozhraní. IShellFolder se používá k vytváření rozšíření oboru názvů.

Jakmile máte identifikátor třídy pro IShellFolder, můžete volat funkci CoCreateInstance načtení adresy rozhraní. Potom můžete volat rozhraní k vytvoření výčtu objektů ve složce a načtení adresy identifikátoru položky pro objekt, který hledáte. Nakonec můžete pomocí adresy ve volání IShellLink::SetIDList členské funkce vytvořit zástupce objektu.