Udostępnij za pośrednictwem


Łącza powłoki

Link powłoki to obiekt danych zawierający informacje używane do uzyskiwania dostępu do innego obiektu w przestrzeni nazw powłoki — czyli dowolny obiekt widoczny za pośrednictwem Eksploratora Windows. Typy obiektów, do których można uzyskać dostęp za pośrednictwem linków powłoki, obejmują pliki, foldery, dyski i drukarki. Link powłoki umożliwia użytkownikowi lub aplikacji dostęp do obiektu z dowolnego miejsca w przestrzeni nazw. Użytkownik lub aplikacja nie musi znać bieżącej nazwy i lokalizacji obiektu.

Użytkownik tworzy link powłoki, wybierając polecenie Create Shortcut z menu skrótów obiektu. System automatycznie tworzy ikonę linku powłoki, łącząc ikonę obiektu z małą strzałką (znaną jako ikona nakładki linku zdefiniowanego przez system), która jest wyświetlana w lewym dolnym rogu ikony. Link powłoki, który ma ikonę, jest nazywany skrótem; jednak terminy Link i skrót powłoki są często używane zamiennie. Zazwyczaj użytkownik tworzy skróty w celu uzyskania szybkiego dostępu do obiektów przechowywanych w podfolderach lub w folderach udostępnionych na innych komputerach. Na przykład użytkownik może utworzyć skrót do dokumentu programu Microsoft Word znajdującego się w podfolderze i umieścić ikonę skrótu na pulpicie. Następnie użytkownik może otworzyć dokument, klikając dwukrotnie ikonę skrótu. Jeśli dokument zostanie przeniesiony lub zmieniony po utworzeniu skrótu, system podejmie próbę zaktualizowania skrótu przy następnym wybraniu go przez użytkownika.

Aplikacje mogą również tworzyć i używać linków powłoki oraz skrótów. Na przykład aplikacja do przetwarzania wyrazów może utworzyć link powłoki w celu zaimplementowania listy ostatnio używanych dokumentów. Aplikacja tworzy link powłoki przy użyciu interfejsu IShellLink w celu utworzenia obiektu łącza powłoki. Aplikacja używa interfejsu IPersistFile lub IPersistStream do przechowywania obiektu w pliku lub strumieniu.

Nuta

Nie można użyć IShellLink, aby utworzyć link do adresu URL.

 

W tym omówieniu opisano interfejs IShellLink i wyjaśniono, jak używać go do tworzenia i rozpoznawania linków powłoki z poziomu aplikacji opartej na platformie Microsoft Win32. Ponieważ projekt łączy powłoki jest oparty na modelu obiektów składników OLE (COM), przed przeczytaniem tego przeglądu należy zapoznać się z podstawowymi pojęciami dotyczącymi programowania COM i OLE.

Jeśli użytkownik utworzy skrót do obiektu, a nazwa lub lokalizacja obiektu zostanie później zmieniona, system automatycznie podejmie kroki aktualizacji lub rozwiązania, skrót po następnym wybraniu go przez użytkownika. Jeśli jednak aplikacja tworzy link powłoki i przechowuje go w strumieniu, system nie próbuje automatycznie rozpoznać linku. Aplikacja musi rozpoznać link, wywołując metodę IShellLink::Resolve.

Po utworzeniu linku powłoki system zapisuje informacje o linku. Podczas rozpoznawania linku — automatycznie lub za pomocą wywołania IShellLink::Resolve — system najpierw pobiera ścieżkę skojarzną z linkiem powłoki przy użyciu wskaźnika do listy identyfikatorów linku powłoki. Aby uzyskać więcej informacji na temat listy identyfikatorów, zobacz identyfikatory elementów i listy identyfikatorów. System wyszukuje skojarzony obiekt w tej ścieżce i, jeśli znajdzie obiekt, rozpozna łącze. Jeśli system nie może odnaleźć obiektu, wywołuje usługę Distributed Link Tracking and Object Identifiers (DLT), jeśli jest dostępna, aby zlokalizować obiekt. Jeśli usługa DLT jest niedostępna lub nie może odnaleźć obiektu, system wyszukuje w tym samym katalogu dla obiektu o tym samym czasie tworzenia pliku i atrybutach, ale o innej nazwie. Ten typ wyszukiwania rozwiązuje link do obiektu, którego nazwa została zmieniona.

Jeśli system nadal nie może odnaleźć obiektu, przeszukuje katalogi, pulpit i woluminy lokalne, patrząc rekursywnie, choć drzewo katalogów dla obiektu o tej samej nazwie lub czasie tworzenia. Jeśli system nadal nie znajdzie dopasowania, zostanie wyświetlone okno dialogowe z monitem użytkownika o lokalizację. Aplikacja może pominąć okno dialogowe, określając wartość SLR_NO_UI w wywołaniu polecenia IShellLink::Resolve.

Inicjowanie biblioteki obiektów składników

Zanim aplikacja będzie mogła tworzyć i rozpoznawać skróty, musi zainicjować bibliotekę obiektów składników przez wywołanie funkcji CoInitialize. Każde wywołanie CoInitialize wymaga odpowiedniego wywołania funkcji CoUninitialize, którą aplikacja powinna wywołać po zakończeniu działania. Wywołanie CoUninitialize gwarantuje, że aplikacja nie zakończy działania, dopóki nie otrzyma wszystkich oczekujących komunikatów.

nazwy Location-Independent

System udostępnia nazwy niezależne od lokalizacji dla łączy powłoki z obiektami przechowywanymi w folderach udostępnionych. Jeśli obiekt jest przechowywany lokalnie, system udostępnia lokalną ścieżkę i nazwę pliku dla obiektu. Jeśli obiekt jest przechowywany zdalnie, system udostępnia nazwę zasobu sieciowego Universal Naming Convention (UNC) dla obiektu. Ponieważ system udostępnia nazwy niezależne od lokalizacji, łącze powłoki może służyć jako uniwersalna nazwa pliku, który można przenieść na inne komputery.

Gdy użytkownik tworzy skrót do obiektu, wybierając polecenie Utwórz skrót z menu skrótów obiektu, system Windows przechowuje informacje potrzebne do uzyskania dostępu do obiektu w pliku linku — plik binarny z rozszerzeniem nazwy pliku .lnk. Plik linku zawiera następujące informacje:

  • Lokalizacja (ścieżka) obiektu, do których odwołuje się skrót (nazywany odpowiednim obiektem).
  • Katalog roboczy odpowiedniego obiektu.
  • Lista argumentów, które system przekazuje do odpowiedniego obiektu, gdy IContextMenu::InvokeCommand metoda jest aktywowana dla skrótu.
  • Polecenie show używane do ustawiania początkowego stanu show odpowiedniego obiektu. Jest to jedna z wartości SW_ opisanych w ShowWindow.
  • Lokalizacja (ścieżka i indeks) ikony skrótu.
  • Ciąg opisu skrótu.
  • Skrót klawiaturowy skrótu.

Po usunięciu pliku łącza odpowiedni obiekt nie ma wpływu.

Jeśli utworzysz skrót do innego skrótu, system po prostu kopiuje plik linku zamiast tworzyć nowy plik linku. W takim przypadku skróty nie będą od siebie niezależne.

Aplikacja może zarejestrować rozszerzenie nazwy pliku jako typ pliku skrótu. Jeśli plik ma rozszerzenie nazwy pliku, które zostało zarejestrowane jako typ pliku skrótu, system automatycznie dodaje ikonę nakładki łącza zdefiniowanego przez system (mała strzałka) do ikony pliku. Aby zarejestrować rozszerzenie nazwy pliku jako typ pliku skrótu, należy dodać wartość IsShortcut do opisu rejestru rozszerzenia nazwy pliku, jak pokazano w poniższym przykładzie. Należy pamiętać, że aby ikona nakładki została uruchomiona, należy ponownie uruchomić powłokę. Funkcja IsShortcut nie ma wartości danych.

HKEY_CLASSES_ROOT
   .xyz
      (Default) = XYZApp
   XYZApp
      IsShortcut

Nazwy skrótów

Nazwa skrótu, który jest ciągiem wyświetlanym poniżej ikony linku powłoki, jest w rzeczywistości nazwą pliku samego skrótu. Użytkownik może edytować ciąg opisu, wybierając go i wprowadzając nowy ciąg.

Lokalizacja skrótów w przestrzeni nazw

Skrót może istnieć na pulpicie lub w dowolnym miejscu w przestrzeni nazw powłoki. Podobnie obiekt skojarzony ze skrótem może również istnieć w dowolnym miejscu w przestrzeni nazw powłoki. Aplikacja może użyć metody IShellLink::SetPath, aby ustawić ścieżkę i nazwę pliku dla skojarzonego obiektu oraz metodę IShellLink::GetPath, aby pobrać bieżącą ścieżkę i nazwę pliku dla obiektu.

Skrót do katalogu roboczego

Katalog roboczy to katalog, w którym odpowiedni obiekt skrótu ładuje lub przechowuje pliki, gdy użytkownik nie identyfikuje określonego katalogu. Plik linku zawiera nazwę katalogu roboczego odpowiedniego obiektu. Aplikacja może ustawić nazwę katalogu roboczego dla odpowiedniego obiektu przy użyciu IShellLink::SetWorkingDirectory metody i może pobrać nazwę bieżącego katalogu roboczego dla odpowiedniego obiektu przy użyciu metody IShellLink::GetWorkingDirectory.

Skrótowe argumenty wiersza polecenia

Plik linku zawiera argumenty wiersza polecenia, które powłoka przekazuje do odpowiedniego obiektu, gdy użytkownik wybierze link. Aplikacja może ustawić argumenty wiersza polecenia skrótu przy użyciu metody IShellLink::SetArguments. Warto ustawić argumenty wiersza polecenia, gdy odpowiednia aplikacja, taka jak konsolidator lub kompilator, przyjmuje specjalne flagi jako argumenty. Aplikacja może pobrać argumenty wiersza polecenia ze skrótu przy użyciu metody IShellLink::GetArguments.

Skrót pokaż polecenia

Gdy użytkownik kliknie dwukrotnie skrót, system uruchamia aplikację skojarzona z odpowiednim obiektem i ustawia początkowy stan show aplikacji na podstawie polecenia show określonego przez skrót. Polecenie show może być dowolną z wartości SW_ uwzględnionych w opisie funkcji ShowWindow. Aplikacja może ustawić polecenie show skrótu przy użyciu metody IShellLink::SetShowCmd i pobrać bieżące polecenie show przy użyciu metody IShellLink::GetShowCmd.

Ikony skrótów

Podobnie jak w przypadku innych obiektów powłoki skrót ma ikonę. Użytkownik uzyskuje dostęp do obiektu skojarzonego ze skrótem, klikając dwukrotnie ikonę skrótu. Gdy system tworzy ikonę skrótu, używa mapy bitowej odpowiedniego obiektu i dodaje ikonę nakładki linku zdefiniowanego przez system (mała strzałka) do lewego dolnego rogu. Aplikacja może ustawić lokalizację (ścieżkę i indeks) ikony skrótu przy użyciu metody IShellLink::SetIconLocation. Aplikacja może pobrać tę lokalizację przy użyciu metody IShellLink::GetIconLocation.

Opisy skrótów

Skróty zawierają opisy, ale użytkownik nigdy ich nie widzi. Aplikacja może użyć opisu do przechowywania dowolnych informacji tekstowych. Opisy są ustawiane przy użyciu metody IShellLink::SetDescription i pobieranej przy użyciu metody IShellLink::GetDescription.

Skróty klawiaturowe

Obiekt skrótu może mieć skojarzony skrót klawiaturowy. Skróty klawiaturowe umożliwiają użytkownikowi naciśnięcie kombinacji w celu aktywowania skrótu. Aplikacja może ustawić skrót klawiaturowy dla skrótu przy użyciu metody IShellLink::SetHotkey i pobrać bieżący skrót klawiaturowy przy użyciu metody IShellLink::GetHotkey.

Identyfikatory elementów i listy identyfikatorów

Powłoka używa identyfikatorów obiektów w przestrzeni nazw powłoki. Wszystkie obiekty widoczne w powłoce (pliki, katalogi, serwery, grupy robocze itd.) mają unikatowe identyfikatory między obiektami w folderze nadrzędnym. Te identyfikatory są nazywane identyfikatorami elementów i mają SHITEMID typ danych zdefiniowany w pliku nagłówkowym Shtypes.h. Identyfikator elementu to strumień bajtów o zmiennej długości, który zawiera informacje identyfikujące obiekt w folderze. Tylko twórca identyfikatora elementu zna zawartość i format identyfikatora. Jedyną częścią identyfikatora elementu używanego przez powłokę jest dwa pierwsze bajty, które określają rozmiar identyfikatora.

Każdy folder nadrzędny ma własny identyfikator elementu, który identyfikuje go we własnym folderze nadrzędnym. W związku z tym dowolny obiekt powłoki może być jednoznacznie identyfikowany przez listę identyfikatorów elementów. Folder nadrzędny przechowuje listę identyfikatorów elementów, które zawiera. Lista zawiera typ danych ITEMIDLIST. Listy identyfikatorów elementów są przydzielane przez powłokę i mogą być przekazywane przez interfejsy powłoki, takie jak IShellFolder. Należy pamiętać, że każdy identyfikator na liście identyfikatorów elementów ma znaczenie tylko w kontekście folderu nadrzędnego.

Aplikacja może ustawić listę identyfikatorów elementów skrótu przy użyciu metody IShellLink::SetIDList. Ta metoda jest przydatna podczas ustawiania skrótu do obiektu, który nie jest plikiem, takim jak drukarka lub dysk. Aplikacja może pobrać listę identyfikatorów elementów skrótu przy użyciu metody IShellLink::GetIDList.

Ta sekcja zawiera przykłady, które pokazują, jak tworzyć i rozwiązywać skróty z poziomu aplikacji opartej na systemie Win32. W tej sekcji założono, że znasz programowanie Win32, C++i OLE COM.

Tworzenie skrótu i skrótu do folderu do pliku

Przykładowa funkcja CreateLink w poniższym przykładzie tworzy skrót. Parametry zawierają wskaźnik do nazwy pliku, do którego ma być link, wskaźnik do nazwy tworzonego skrótu oraz wskaźnik do opisu linku. Opis składa się z ciągu "Skrót do nazwy pliku ", gdzie nazwa pliku jest nazwą pliku do połączenia.

Aby utworzyć skrót do folderu przy użyciu przykładowej funkcji CreateLink, wywołaj metodę CoCreateInstance przy użyciu CLSID_FolderShortcut, zamiast CLSID_ShellLink (CLSID_FolderShortcut obsługuje interfejs IShellLink). Cały inny kod pozostaje taki sam.

Ponieważ funkcja CreateLink wywołuje funkcjęCoCreateInstance, zakłada się, że funkcja CoInitialize została już wywołana. Funkcja CreateLink używa interfejsuIPersistFile, aby zapisać skrót i interfejs IShellLink do przechowywania nazwy pliku i opisu.

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

Rozpoznawanie skrótu

Aplikacja może wymagać dostępu do skrótu utworzonego wcześniej i manipulowania nim. Ta operacja jest określana jako rozpoznawanie skrótu.

Funkcja ResolveIt zdefiniowana przez aplikację w poniższym przykładzie rozpoznaje skrót. Jego parametry obejmują uchwyt okna, wskaźnik do ścieżki skrótu i adres buforu, który odbiera nową ścieżkę do obiektu. Uchwyt okna identyfikuje okno nadrzędne dla wszystkich pól komunikatów, które może być konieczne do wyświetlenia powłoki. Na przykład powłoka może wyświetlić pole komunikatu, jeśli link znajduje się na nośniku nieudostępnym, jeśli wystąpią problemy z siecią, jeśli użytkownik musi wstawić dyskietkę itd.

Funkcja ResolveIt wywołuje funkcję CoCreateInstance i zakłada, że funkcja CoInitialize została już wywołana. Należy pamiętać, że funkcja ResolveIt musi używać interfejsu IPersistFile do przechowywania informacji o linku. IPersistFile jest implementowany przez obiekt IShellLink. Informacje o linku muszą zostać załadowane przed pobraniem informacji o ścieżce, która zostanie wyświetlona w dalszej części przykładu. Nie można załadować informacji o linku powoduje niepowodzenie wywołań funkcji IShellLink::GetPath i IShellLink::GetDescription funkcji składowych.

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

Tworzenie skrótu do obiektu nieplikowego

Tworzenie skrótu do obiektu nieplikowego, takiego jak drukarka, jest podobne do tworzenia skrótu do pliku, z tą różnicą, że zamiast ustawiać ścieżkę do pliku, należy ustawić listę identyfikatorów na drukarkę. Aby ustawić listę identyfikatorów, wywołaj metodę IShellLink::SetIDList, określając adres listy identyfikatorów.

Każdy obiekt w przestrzeni nazw powłoki ma identyfikator elementu. Powłoka często łączy identyfikatory elementów z listami zakończonymi wartościami null składającymi się z dowolnej liczby identyfikatorów elementów. Aby uzyskać więcej informacji na temat identyfikatorów elementów, zobacz identyfikatory elementów i listy identyfikatorów.

Ogólnie rzecz biorąc, jeśli musisz ustawić skrót do elementu, który nie ma nazwy pliku, na przykład drukarki, będzie już miał wskaźnik do interfejsu IShellFold er obiektu. IShellFolder służy do tworzenia rozszerzeń przestrzeni nazw.

Po utworzeniu identyfikatora klasy dla IShellFoldermożna wywołać funkcję CoCreateInstance w celu pobrania adresu interfejsu. Następnie można wywołać interfejs w celu wyliczenia obiektów w folderze i pobrać adres identyfikatora elementu dla obiektu, którego szukasz. Na koniec możesz użyć adresu w wywołaniu do IShellLink::SetIDList funkcji składowej, aby utworzyć skrót do obiektu.