Tautan Shell

Tautan Shell adalah objek data yang berisi informasi yang digunakan untuk mengakses objek lain di namespace Shell—yaitu, objek apa pun yang terlihat melalui Windows Explorer. Jenis objek yang dapat diakses melalui tautan Shell meliputi file, folder, drive disk, dan printer. Tautan Shell memungkinkan pengguna atau aplikasi mengakses objek dari mana saja di namespace layanan. Pengguna atau aplikasi tidak perlu mengetahui nama dan lokasi objek saat ini.

Pengguna membuat tautan Shell dengan memilih perintah Buat Pintasan dari menu pintasan objek. Sistem secara otomatis membuat ikon untuk tautan Shell dengan menggabungkan ikon objek dengan panah kecil (dikenal sebagai ikon overlay tautan yang ditentukan sistem) yang muncul di sudut kiri bawah ikon. Tautan Shell yang memiliki ikon disebut pintasan; namun, istilah tautan shell dan pintasan sering digunakan secara bergantian. Biasanya, pengguna membuat pintasan untuk mendapatkan akses cepat ke objek yang disimpan di subfolder atau di folder bersama di komputer lain. Misalnya, pengguna dapat membuat pintasan ke dokumen Microsoft Word yang terletak di subfolder dan menempatkan ikon pintasan di desktop. Pengguna kemudian dapat membuka dokumen dengan mengklik dua kali ikon pintasan. Jika dokumen dipindahkan atau diganti namanya setelah pintasan dibuat, sistem akan mencoba memperbarui pintasan saat berikutnya pengguna memilihnya.

Aplikasi juga dapat membuat dan menggunakan tautan dan pintasan Shell. Misalnya, aplikasi pemrosesan kata mungkin membuat tautan Shell untuk mengimplementasikan daftar dokumen yang terakhir digunakan. Aplikasi membuat tautan Shell dengan menggunakan antarmuka IShellLink untuk membuat objek tautan Shell. Aplikasi ini menggunakan antarmuka IPersistFile atau IPersistStream untuk menyimpan objek dalam file atau aliran.

Catatan

Anda tidak dapat menggunakan IShellLink untuk membuat tautan ke URL.

 

Gambaran umum ini menjelaskan antarmuka IShellLink dan menjelaskan cara menggunakannya untuk membuat dan menyelesaikan tautan Shell dari dalam aplikasi berbasis Microsoft Win32. Karena desain tautan Shell didasarkan pada Model Objek Komponen (COM) OLE, Anda harus terbiasa dengan konsep dasar pemrograman COM dan OLE sebelum membaca gambaran umum ini.

Jika pengguna membuat pintasan ke objek dan nama atau lokasi objek kemudian diubah, sistem secara otomatis mengambil langkah-langkah untuk memperbarui, atau mengatasinya, pintasan saat berikutnya pengguna memilihnya. Namun, jika aplikasi membuat tautan Shell dan menyimpannya dalam aliran, sistem tidak secara otomatis mencoba menyelesaikan tautan. Aplikasi harus menyelesaikan tautan dengan memanggil metode IShellLink::Resolve .

Saat tautan Shell dibuat, sistem menyimpan informasi tentang tautan. Saat menyelesaikan tautan—baik secara otomatis atau dengan IShellLink::Resolve call—sistem terlebih dahulu mengambil jalur yang terkait dengan tautan Shell dengan menggunakan penunjuk ke daftar pengidentifikasi tautan Shell. Untuk informasi selengkapnya tentang daftar pengidentifikasi, lihat Pengidentifikasi Item dan Daftar Pengidentifikasi. Sistem mencari objek terkait di jalur tersebut dan, jika menemukan objek, menyelesaikan tautan. Jika sistem tidak dapat menemukan objek , sistem memanggil layanan Pelacakan Tautan Terdistribusi dan Pengidentifikasi Objek (DLT), jika tersedia, untuk menemukan objek. Jika layanan DLT tidak tersedia atau tidak dapat menemukan objek, sistem akan melihat direktori yang sama untuk objek dengan waktu dan atribut pembuatan file yang sama tetapi dengan nama yang berbeda. Jenis pencarian ini menyelesaikan tautan ke objek yang telah diganti namanya.

Jika sistem masih tidak dapat menemukan objek , sistem mencari direktori, desktop, dan volume lokal, terlihat secara rekursif meskipun pohon direktori untuk objek dengan nama atau waktu pembuatan yang sama. Jika sistem masih tidak menemukan kecocokan, sistem akan menampilkan kotak dialog yang meminta lokasi kepada pengguna. Aplikasi dapat menekan kotak dialog dengan menentukan nilai SLR_NO_UI dalam panggilan ke IShellLink::Resolve.

Inisialisasi Pustaka Objek Komponen

Sebelum aplikasi dapat membuat dan mengatasi pintasan, aplikasi harus menginisialisasi pustaka objek komponen dengan memanggil fungsi CoInitialize . Setiap panggilan ke CoInitialize memerlukan panggilan yang sesuai ke fungsi CoUninitialize , yang harus dipanggil aplikasi ketika dihentikan. Panggilan ke CoUninitialize memastikan bahwa aplikasi tidak berakhir sampai menerima semua pesan yang tertunda.

Nama Location-Independent

Sistem ini menyediakan nama yang tidak bergantung pada lokasi untuk tautan Shell ke objek yang disimpan dalam folder bersama. Jika objek disimpan secara lokal, sistem menyediakan jalur lokal dan nama file untuk objek. Jika objek disimpan dari jarak jauh, sistem menyediakan nama sumber daya jaringan Universal Naming Convention (UNC) untuk objek tersebut. Karena sistem menyediakan nama yang tidak bergantung pada lokasi, tautan Shell dapat berfungsi sebagai nama universal untuk file yang dapat ditransfer ke komputer lain.

Saat pengguna membuat pintasan ke objek dengan memilih perintah Buat Pintasan dari menu pintasan objek, Windows menyimpan informasi yang diperlukan untuk mengakses objek dalam file tautan—file biner yang memiliki ekstensi nama file .lnk. File tautan berisi informasi berikut:

  • Lokasi (jalur) objek yang dirujuk oleh pintasan (disebut objek yang sesuai).
  • Direktori kerja objek yang sesuai.
  • Daftar argumen yang diteruskan sistem ke objek yang sesuai ketika metode IContextMenu::InvokeCommand diaktifkan untuk pintasan.
  • Perintah tampilkan yang digunakan untuk mengatur status peragaan awal objek yang sesuai. Ini adalah salah satu nilai SW_ yang dijelaskan dalam ShowWindow.
  • Lokasi (jalur dan indeks) ikon pintasan.
  • String deskripsi pintasan.
  • Pintasan keyboard untuk pintasan.

Saat file tautan dihapus, objek terkait tidak terpengaruh.

Jika Anda membuat pintasan ke pintasan lain, sistem hanya menyalin file tautan daripada membuat file tautan baru. Dalam hal ini, pintasan tidak akan independen satu sama lain.

Aplikasi dapat mendaftarkan ekstensi nama file sebagai jenis file pintasan. Jika file memiliki ekstensi nama file yang telah terdaftar sebagai jenis file pintasan, sistem secara otomatis menambahkan ikon overlay tautan yang ditentukan sistem (panah kecil) ke ikon file. Untuk mendaftarkan ekstensi nama file sebagai jenis file pintasan, Anda harus menambahkan nilai IsShortcut ke deskripsi registri ekstensi nama file, seperti yang ditunjukkan pada contoh di bawah ini. Perhatikan bahwa Shell harus dimulai ulang agar ikon overlay berlaku. IsShortcut tidak memiliki nilai data.

HKEY_CLASSES_ROOT
   .xyz
      (Default) = XYZApp
   XYZApp
      IsShortcut

Nama pintasan

Nama pintasan, yang merupakan string yang muncul di bawah ikon tautan Shell, sebenarnya adalah nama file pintasan itu sendiri. Pengguna dapat mengedit string deskripsi dengan memilihnya dan memasukkan string baru.

Lokasi pintasan di namespace

Pintasan dapat ada di desktop atau di mana saja di namespace Shell. Demikian pula, objek yang terkait dengan pintasan juga dapat ada di mana saja di namespace Shell. Aplikasi dapat menggunakan metode IShellLink::SetPath untuk mengatur jalur dan nama file untuk objek terkait, dan metode IShellLink::GetPath untuk mengambil jalur dan nama file saat ini untuk objek.

Direktori kerja pintasan

Direktori kerja adalah direktori tempat objek pintasan yang sesuai memuat atau menyimpan file ketika pengguna tidak mengidentifikasi direktori tertentu. File tautan berisi nama direktori kerja untuk objek yang sesuai. Aplikasi dapat mengatur nama direktori kerja untuk objek yang sesuai dengan menggunakan metode IShellLink::SetWorkingDirectory dan dapat mengambil nama direktori kerja saat ini untuk objek yang sesuai dengan menggunakan metode IShellLink::GetWorkingDirectory .

Argumen baris perintah pintasan

File tautan berisi argumen baris perintah yang diteruskan Shell ke objek yang sesuai saat pengguna memilih tautan. Aplikasi dapat mengatur argumen baris perintah untuk pintasan dengan menggunakan metode IShellLink::SetArguments . Hal ini berguna untuk mengatur argumen baris perintah ketika aplikasi yang sesuai, seperti linker atau compiler, mengambil bendera khusus sebagai argumen. Aplikasi dapat mengambil argumen baris perintah dari pintasan dengan menggunakan metode IShellLink::GetArguments .

Perintah peragaan pintasan

Ketika pengguna mengklik dua kali pintasan, sistem memulai aplikasi yang terkait dengan objek yang sesuai dan mengatur status peragaan awal aplikasi berdasarkan perintah tampilkan yang ditentukan oleh pintasan. Perintah tampilkan dapat berupa salah satu nilai SW_ yang disertakan dalam deskripsi fungsi ShowWindow . Aplikasi dapat mengatur perintah show untuk pintasan dengan menggunakan metode IShellLink::SetShowCmd dan dapat mengambil perintah show saat ini dengan menggunakan metode IShellLink::GetShowCmd .

Ikon pintasan

Seperti objek Shell lainnya, pintasan memiliki ikon. Pengguna mengakses objek yang terkait dengan pintasan dengan mengklik dua kali ikon pintasan. Saat sistem membuat ikon untuk pintasan, sistem menggunakan bitmap objek yang sesuai dan menambahkan ikon overlay tautan yang ditentukan sistem (panah kecil) ke sudut kiri bawah. Aplikasi dapat mengatur lokasi (jalur dan indeks) ikon pintasan dengan menggunakan metode IShellLink::SetIconLocation . Aplikasi dapat mengambil lokasi ini dengan menggunakan metode IShellLink::GetIconLocation .

Deskripsi pintasan

Pintasan memiliki deskripsi, tetapi pengguna tidak pernah melihatnya. Aplikasi dapat menggunakan deskripsi untuk menyimpan informasi teks apa pun. Deskripsi diatur menggunakan metode IShellLink::SetDescription dan diambil menggunakan metode IShellLink::GetDescription .

Pintasan Keyboard Pintasan

Objek pintasan bisa memiliki pintasan keyboard yang terkait dengannya. Pintasan keyboard memungkinkan pengguna menekan kombinasi tombol untuk mengaktifkan pintasan. Aplikasi dapat mengatur pintasan keyboard untuk pintasan dengan menggunakan metode IShellLink::SetHotkey dan dapat mengambil pintasan keyboard saat ini dengan menggunakan metode IShellLink::GetHotkey .

Pengidentifikasi Item dan Daftar Pengidentifikasi

Shell menggunakan pengidentifikasi objek dalam namespace shell. Semua objek yang terlihat di Shell (file, direktori, server, grup kerja, dan sebagainya) memiliki pengidentifikasi unik di antara objek dalam folder induknya. Pengidentifikasi ini disebut pengidentifikasi item, dan mereka memiliki jenis data SHITEMID seperti yang didefinisikan dalam file header Shtypes.h. Pengidentifikasi item adalah aliran byte panjang variabel yang berisi informasi yang mengidentifikasi objek dalam folder. Hanya pembuat pengidentifikasi item yang mengetahui konten dan format pengidentifikasi. Satu-satunya bagian dari pengidentifikasi item yang digunakan Shell adalah dua byte pertama, yang menentukan ukuran pengidentifikasi.

Setiap folder induk memiliki pengidentifikasi item sendiri yang mengidentifikasinya dalam folder induknya sendiri. Dengan demikian, objek Shell apa pun dapat diidentifikasi secara unik oleh daftar pengidentifikasi item. Folder induk menyimpan daftar pengidentifikasi untuk item yang dikandungnya. Daftar ini memiliki tipe data ITEMIDLIST . Daftar pengidentifikasi item dialokasikan oleh Shell dan dapat diteruskan di seluruh antarmuka Shell, seperti IShellFolder. Penting untuk diingat bahwa setiap pengidentifikasi dalam daftar pengidentifikasi item hanya bermakna dalam konteks folder induknya.

Aplikasi dapat mengatur daftar pengidentifikasi item pintasan dengan menggunakan metode IShellLink::SetIDList . Metode ini berguna ketika menyetel pintasan ke objek yang bukan berkas, seperti pencetak atau kandar disk. Aplikasi dapat mengambil daftar pengidentifikasi item pintasan dengan menggunakan metode IShellLink::GetIDList .

Bagian ini berisi contoh yang menunjukkan cara membuat dan mengatasi pintasan dari dalam aplikasi berbasis Win32. Bagian ini mengasumsikan Anda terbiasa dengan pemrograman Win32, C++, dan OLE COM.

Membuat Pintasan dan Pintasan Folder ke File

Fungsi sampel CreateLink dalam contoh berikut membuat pintasan. Parameter menyertakan penunjuk ke nama file yang akan ditautkan, penunjuk ke nama pintasan yang Anda buat, dan penunjuk ke deskripsi tautan. Deskripsi terdiri dari string, "Pintasan ke nama file," di mana nama file adalah nama file yang akan ditautkan.

Untuk membuat pintasan folder menggunakan fungsi sampel CreateLink, panggil CoCreateInstance menggunakan CLSID_FolderShortcut, bukan CLSID_ShellLink (CLSID_FolderShortcut mendukung IShellLink). Semua kode lainnya tetap sama.

Karena CreateLink memanggil fungsi CoCreateInstance , diasumsikan bahwa fungsi CoInitialize telah dipanggil. CreateLink menggunakan antarmuka IPersistFile untuk menyimpan pintasan dan antarmuka IShellLink untuk menyimpan nama dan deskripsi file.

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

Mengatasi Pintasan

Aplikasi mungkin perlu mengakses dan memanipulasi pintasan yang sebelumnya dibuat. Operasi ini disebut sebagai menyelesaikan pintasan.

Fungsi ResolveIt yang ditentukan aplikasi dalam contoh berikut menyelesaikan pintasan. Parameternya mencakup handel jendela, penunjuk ke jalur pintasan, dan alamat buffer yang menerima jalur baru ke objek. Handel jendela mengidentifikasi jendela induk untuk kotak pesan apa pun yang mungkin perlu ditampilkan shell. Misalnya, Shell dapat menampilkan kotak pesan jika tautan berada di media yang tidak dibagikan, jika masalah jaringan terjadi, jika pengguna perlu memasukkan disket, dan sebagainya.

Fungsi ResolveIt memanggil fungsi CoCreateInstance dan mengasumsikan bahwa fungsi CoInitialize telah dipanggil. Perhatikan bahwa ResolveIt perlu menggunakan antarmuka IPersistFile untuk menyimpan informasi tautan. IPersistFile diimplementasikan oleh objek IShellLink . Informasi tautan harus dimuat sebelum informasi jalur diambil, yang ditampilkan nanti dalam contoh. Gagal memuat informasi tautan menyebabkan panggilan ke fungsi anggota IShellLink::GetPath dan IShellLink::GetDescription gagal.

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

Membuat Pintasan ke Objek Nonfile

Membuat pintasan ke objek nonfile, seperti printer, mirip dengan membuat pintasan ke file kecuali bahwa daripada menyetel jalur ke file, Anda harus mengatur daftar pengidentifikasi ke pencetak. Untuk mengatur daftar pengidentifikasi, panggil metode IShellLink::SetIDList , yang menentukan alamat daftar pengidentifikasi.

Setiap objek dalam namespace Shell memiliki pengidentifikasi item. Shell sering menggabungkan pengidentifikasi item ke dalam daftar yang dihentikan null yang terdiri dari sejumlah pengidentifikasi item. Untuk informasi selengkapnya tentang pengidentifikasi item, lihat Pengidentifikasi Item dan Daftar Pengidentifikasi.

Secara umum, jika Anda perlu mengatur pintasan ke item yang tidak memiliki nama file, seperti printer, Anda sudah memiliki penunjuk ke antarmuka IShellFolder objek. IShellFolder digunakan untuk membuat ekstensi namespace.

Setelah Anda memiliki pengidentifikasi kelas untuk IShellFolder, Anda dapat memanggil fungsi CoCreateInstance untuk mengambil alamat antarmuka. Kemudian Anda dapat memanggil antarmuka untuk menghitung objek di folder dan mengambil alamat pengidentifikasi item untuk objek yang Anda cari. Terakhir, Anda dapat menggunakan alamat dalam panggilan ke fungsi anggota IShellLink::SetIDList untuk membuat pintasan ke objek.