Kabuk Bağlantıları
Kabuğu bağlantısı, Kabuğun ad alanındaki başka bir nesneye erişmek için kullanılan bilgileri (yani Windows Gezgini aracılığıyla görünen herhangi bir nesneyi) içeren bir veri nesnesidir. Kabuk bağlantıları aracılığıyla erişilebilen nesne türleri dosya, klasör, disk sürücüsü ve yazıcıdır. Kabuk bağlantısı, bir kullanıcının veya uygulamanın ad alanında herhangi bir yerden bir nesneye erişmesine olanak tanır. Kullanıcının veya uygulamanın nesnenin geçerli adını ve konumunu bilmesi gerekmez.
- Kabuk Bağlantıları hakkında
- Bağlantı Çözümleme
- Dosyaları Bağlama
- Öğe Tanımlayıcıları ve Tanımlayıcı Listeleri
- Kabuk Bağlantılarını Kullanarak
- Dosya Için Kısayol ve Klasör Kısayolu Oluşturma
- Kısayol Çözümlemeyi
- Dosya Olmayan Nesne Için Kısayol Oluşturma
Kabuk Bağlantıları Hakkında
Kullanıcı, nesnenin kısayol menüsünden Kısayol Oluştur komutunu seçerek bir Kabuk bağlantısı oluşturur. Sistem, nesnenin simgesini simgenin sol alt köşesinde görünen küçük bir okla (sistem tanımlı bağlantı katman simgesi olarak bilinir) birleştirerek Kabuk bağlantısı için otomatik olarak bir simge oluşturur. Simgesi olan kabuk bağlantısına kısayol adı verilir; ancak Kabuk bağlantısı ve kısayol terimleri genellikle birbirinin yerine kullanılır. Genellikle, kullanıcı alt klasörlerde veya diğer bilgisayarlardaki paylaşılan klasörlerde depolanan nesnelere hızlı erişim elde etmek için kısayollar oluşturur. Örneğin, bir kullanıcı alt klasörde bulunan bir Microsoft Word belgesine kısayol oluşturabilir ve kısayol simgesini masaüstüne yerleştirebilir. Kullanıcı daha sonra kısayol simgesine çift tıklayarak belgeyi açabilir. Kısayol oluşturulduktan sonra belge taşınır veya yeniden adlandırılırsa, kullanıcı kısayolu bir sonraki seçtiğinde sistem kısayolu güncelleştirmeyi dener.
Uygulamalar kabuk bağlantıları ve kısayolları da oluşturabilir ve kullanabilir. Örneğin, bir sözcük işleme uygulaması, en son kullanılan belgelerin listesini uygulamak için bir Kabuk bağlantısı oluşturabilir. Uygulama, kabuk bağlantısı nesnesi oluşturmak için IShellLink arabirimini kullanarak bir Kabuk bağlantısı oluşturur. Uygulama, nesneyi bir dosyada veya akışta depolamak için IPersistFile veya IPersistStream arabirimini kullanır.
Bu genel bakış, IShellLink arabirimini açıklar ve Microsoft Win32 tabanlı bir uygulama içinden Kabuk bağlantıları oluşturmak ve çözmek için nasıl kullanılacağını açıklar. Kabuk bağlantılarının tasarımı OLE Bileşeni Nesne Modeli'ni (COM) temel alarak olduğundan, bu genel bakışı okumadan önce COM ve OLE programlamanın temel kavramları hakkında bilgi sahibi olmanız gerekir.
Bağlantı Çözünürlüğü
Kullanıcı bir nesnenin kısayolunu oluşturursa ve nesnenin adı veya konumu daha sonra değiştirilirse, sistem otomatik olarak kısayolu bir sonraki seçişinde güncelleştirme veya çözme adımlarını uygular. Ancak, bir uygulama bir Kabuk bağlantısı oluşturur ve bunu bir akışta depolarsa, sistem bağlantıyı otomatik olarak çözümlemeye çalışmaz. Uygulamanın IShellLink::Resolve yöntemini çağırarak bağlantıyı çözümlemesi gerekir.
Bir Kabuk bağlantısı oluşturulduğunda, sistem bağlantı hakkındaki bilgileri kaydeder. Bağlantı otomatik olarak veya IShellLink::Resolve çağrısıyla çözümlendiğinde, sistem önce Kabuk bağlantısının tanımlayıcı listesinin işaretçisini kullanarak Kabuk bağlantısıyla ilişkili yolu alır. Tanımlayıcı listesi hakkında daha fazla bilgi için bkz. öğe tanımlayıcıları ve tanımlayıcı listeleri . Sistem bu yolda ilişkili nesneyi arar ve nesneyi bulursa bağlantıyı çözümler. Sistem nesneyi bulamazsa, nesneyi bulmak için Dağıtılmış Bağlantı İzleme ve Nesne Tanımlayıcıları (DLT) hizmetini çağırır. DLT hizmeti kullanılamıyorsa veya nesneyi bulamıyorsa, sistem aynı dosya oluşturma zamanına ve özniteliklerine sahip ancak farklı bir ada sahip bir nesne için aynı dizinde arar. Bu tür bir arama, yeniden adlandırılmış bir nesnenin bağlantısını çözümler.
Sistem nesneyi yine de bulamazsa dizinlerde, masaüstünde ve yerel birimlerde arama yapıp dizin ağacının aynı ada veya oluşturma zamanına sahip bir nesne için özyinelemeli olarak bakmasına neden olur. Sistem yine de eşleşme bulamazsa, kullanıcıdan konum isteyen bir iletişim kutusu görüntüler. Bir uygulama, IShellLink::Resolveçağrısında SLR_NO_UI değerini belirterek iletişim kutusunu gizleyebilir.
Bileşen Nesne Kitaplığı'nın başlatılması
Bir uygulamanın kısayolları oluşturabilmesi ve çözümleyebilmesi için önce CoInitialize işlevini çağırarak bileşen nesne kitaplığını başlatması gerekir. CoInitialize her çağrı, bir uygulamanın sonlandırıldığında çağırması gereken CoUninitialize işlevine karşılık gelen bir çağrı gerektirir. CoUninitialize çağrısı, uygulamanın bekleyen tüm iletilerini alıncaya kadar sonlandırılmamasını sağlar.
Location-Independent Adları
Sistem, paylaşılan klasörlerde depolanan nesnelere Kabuk bağlantıları için konumdan bağımsız adlar sağlar. Nesne yerel olarak depolanıyorsa, sistem nesne için yerel yolu ve dosya adını sağlar. Nesne uzaktan depolanıyorsa, sistem nesne için bir Evrensel Adlandırma Kuralı (UNC) ağ kaynağı adı sağlar. Sistem konumdan bağımsız adlar sağladığından, kabuk bağlantısı diğer bilgisayarlara aktarılabilir bir dosya için evrensel bir ad görevi görebilir.
Dosyaları Bağla
Kullanıcı, nesnenin kısayol menüsünden Kısayol Oluştur komutunu seçerek bir nesnenin kısayolunu oluşturduğunda, Windows nesneye erişmek için gereken bilgileri .lnk dosya adı uzantısına sahip ikili dosya olan bir bağlantı dosyasında depolar. Bağlantı dosyası aşağıdaki bilgileri içerir:
- Kısayol tarafından başvurulan nesnenin konumu (yol) (karşılık gelen nesne olarak adlandırılır).
- İlgili nesnenin çalışma dizini.
- Kısayol için IContextMenu::InvokeCommand yöntemi etkinleştirildiğinde sistemin ilgili nesneye geçirdiği bağımsız değişkenlerin listesi.
- karşılık gelen nesnenin ilk gösteri durumunu ayarlamak için kullanılan show komutu. Bu, ShowWindowiçinde açıklanan SW_ değerlerinden biridir.
- Kısayol simgesinin konumu (yol ve dizin).
- Kısayol açıklama dizesi.
- Kısayol için klavye kısayolu.
Bağlantı dosyası silindiğinde, ilgili nesne etkilenmez.
Başka bir kısayola kısayol oluşturursanız, sistem yeni bir bağlantı dosyası oluşturmak yerine bağlantı dosyasını kopyalar. Bu durumda kısayollar birbirinden bağımsız olmayacaktır.
Bir uygulama, bir dosya adı uzantısını kısayol dosya türü olarak kaydedebilir. Bir dosya, kısayol dosya türü olarak kaydedilmiş bir dosya adı uzantısına sahipse, sistem tarafından tanımlanan bağlantı katman simgesini (küçük bir ok) dosya simgesine otomatik olarak ekler. Bir dosya adı uzantısını kısayol dosya türü olarak kaydetmek için, aşağıdaki örnekte gösterildiği gibi Dosya adı uzantısının kayıt defteri açıklamasına IsShortcut değerini eklemeniz gerekir. Katman simgesinin etkili olması için Kabuğun yeniden başlatılması gerektiğini unutmayın. IsShortcut'un veri değeri yok.
HKEY_CLASSES_ROOT
.xyz
(Default) = XYZApp
XYZApp
IsShortcut
Kısayol adları
Kabuk bağlantı simgesinin altında görünen bir dize olan kısayolun adı aslında kısayolun dosya adıdır. Kullanıcı, açıklama dizesini seçip yeni bir dize girerek düzenleyebilir.
Ad alanında kısayolların konumu
Masaüstünde veya Kabuğun ad alanında herhangi bir yerde bir kısayol bulunabilir. Benzer şekilde, kısayolla ilişkili nesne de Kabuğun ad alanında herhangi bir yerde bulunabilir. Bir uygulama, ilişkili nesnenin yolunu ve dosya adını ayarlamak için IShellLink::SetPathyöntemini ve nesnenin geçerli yolunu ve dosya adını almak için IShellLink::GetPath yöntemini kullanabilir.
Kısayol çalışma dizini
Çalışma dizini, kullanıcı belirli bir dizini tanımlamadığında bir kısayolun karşılık gelen nesnesinin dosyaları yüklediği veya depoladığı dizindir. Bağlantı dosyası, ilgili nesnenin çalışma dizininin adını içerir. Uygulama, IShellLink::SetWorkingDirectory yöntemini kullanarak ilgili nesne için çalışma dizininin adını ayarlayabilir ve IShellLink::GetWorkingDirectory yöntemini kullanarak ilgili nesne için geçerli çalışma dizininin adını alabilir.
Kısayol komut satırı bağımsız değişkenleri
Bağlantı dosyası, kullanıcı bağlantıyı seçtiğinde Shell'in ilgili nesneye geçirdiği komut satırı bağımsız değişkenleri içerir. Uygulama, IShellLink::SetArguments yöntemini kullanarak bir kısayol için komut satırı bağımsız değişkenlerini ayarlayabilir. Bağlayıcı veya derleyici gibi ilgili uygulama bağımsız değişken olarak özel bayraklar aldığında komut satırı bağımsız değişkenlerini ayarlamak yararlıdır. Uygulama, IShellLink::GetArguments yöntemini kullanarak bir kısayoldan komut satırı bağımsız değişkenlerini alabilir.
Komutları gösteren kısayol
Kullanıcı bir kısayola çift tıkladığında, sistem ilgili nesneyle ilişkili uygulamayı başlatır ve kısayol tarafından belirtilen show komutuna göre uygulamanın ilk gösterme durumunu ayarlar. show komutu, ShowWindow işlevinin açıklamasına dahil edilen SW_ değerlerden herhangi biri olabilir. Uygulama, IShellLink::SetShowCmdyönteminikullanarak kısayol için show komutunu ayarlayabilir ve IShellLink::GetShowCmdyönteminikullanarak geçerli show komutunu alabilir.
Kısayol simgeleri
Diğer Shell nesneleri gibi, kısayolda da bir simge vardır. Kullanıcı, kısayol simgesine çift tıklayarak kısayolla ilişkili nesneye erişir. Sistem kısayol için bir simge oluşturduğunda, ilgili nesnenin bit eşlemini kullanır ve sistem tanımlı bağlantı katman simgesini (küçük bir ok) sol alt köşeye ekler. Uygulama, IShellLink::SetIconLocation yöntemini kullanarak kısayol simgesinin konumunu (yol ve dizin) ayarlayabilir. Bir uygulama, IShellLink::GetIconLocation yöntemini kullanarak bu konumu alabilir.
Kısayol açıklamaları
Kısayolların açıklamaları vardır, ancak kullanıcı bunları hiç görmez. Bir uygulama, metin bilgilerini depolamak için bir açıklama kullanabilir. Açıklamalar IShellLink::SetDescription yöntemi kullanılarak ayarlanır ve IShellLink::GetDescription yöntemi kullanılarak alınır.
Kısayol Klavye Kısayolları
Kısayol nesnesinin kendisiyle ilişkilendirilmiş bir klavye kısayolu olabilir. Klavye kısayolları, kullanıcının kısayolu etkinleştirmek için tuş birleşimine basmasına olanak tanır. Uygulama, IShellLink::SetHotkey yöntemini kullanarak kısayol için klavye kısayolunu ayarlayabilir ve IShellLink::GetHotkeyyönteminikullanarak geçerli klavye kısayolunu alabilir.
Öğe Tanımlayıcıları ve Tanımlayıcı Listeleri
Shell, Kabuğun ad alanı içindeki nesne tanımlayıcılarını kullanır. Kabukta görünen tüm nesnelerin (dosyalar, dizinler, sunucular, çalışma grupları vb.) üst klasörlerindeki nesneler arasında benzersiz tanımlayıcıları vardır. Bu tanımlayıcılar öğe tanımlayıcıları olarak adlandırılır ve Shtypes.h üst bilgi dosyasında tanımlanan SHITEMID veri türüne sahiptir. Öğe tanımlayıcısı, klasör içindeki bir nesneyi tanımlayan bilgileri içeren değişken uzunlukta bir bayt akışıdır. Tanımlayıcının içeriğini ve biçimini yalnızca öğe tanımlayıcısının oluşturucusu bilir. Kabuk tarafından kullanılan öğe tanımlayıcısının tek bölümü, tanımlayıcının boyutunu belirten ilk iki bayttır.
Her üst klasörün kendi üst klasörü içinde tanımlayan kendi öğe tanımlayıcısı vardır. Bu nedenle, herhangi bir Shell nesnesi öğe tanımlayıcıları listesi tarafından benzersiz olarak tanımlanabilir. Üst klasör, içerdiği öğeler için tanımlayıcıların listesini tutar. Listede ITEMIDLISTveri türü. Öğe tanımlayıcı listeleri Shell tarafından ayrılır ve IShellFoldergibi Kabuk arabirimleri arasında geçirilebilir. Öğe tanımlayıcı listesindeki her tanımlayıcının yalnızca üst klasörü bağlamında anlamlı olduğunu unutmamak önemlidir.
Uygulama, IShellLink::SetIDList yöntemini kullanarak kısayol öğe tanımlayıcı listesini ayarlayabilir. Bu yöntem, yazıcı veya disk sürücüsü gibi dosya olmayan bir nesneye kısayol ayarlarken kullanışlıdır. Uygulama, IShellLink::GetIDList yöntemini kullanarak kısayol öğe tanımlayıcı listesini alabilir.
Kabuk Bağlantılarını Kullanma
Bu bölüm, Win32 tabanlı bir uygulamanın içinden kısayolların nasıl oluşturulacağını ve çözümlendiğini gösteren örnekler içerir. Bu bölümde Win32, C++ ve OLE COM programlama hakkında bilgi sahibi olduğunuz varsayılır.
Bir Dosya için Kısayol ve Klasör Kısayolu Oluşturma
Aşağıdaki örnekteki CreateLink örnek işlevi bir kısayol oluşturur. Parametreler arasında bağlanılacak dosyanın adına yönelik bir işaretçi, oluşturduğunuz kısayolun adına yönelik bir işaretçi ve bağlantının açıklamasına yönelik bir işaretçi bulunur. Açıklama, "dosya adıkısayolu" dizesini oluşturur; burada dosya adı bağlanılacak dosyanın adıdır.
CreateLink örnek işlevini kullanarak klasör kısayolu oluşturmak için, CLSID_ShellLink yerine CLSID_FolderShortcut kullanarak CoCreateInstance çağırın (CLSID_FolderShortcut IShellLink'i destekler). Diğer tüm kodlar aynı kalır.
CreateLink CoCreateInstance işlevini çağırdığından, CoInitialize işlevinin zaten çağrıldığı varsayılır. CreateLink, kısayolu kaydetmek için IPersistFile arabirimini, dosya adını ve açıklamasını depolamak için IShellLink arabirimini kullanır.
// 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;
Kısayolu Çözümleme
Bir uygulamanın daha önce oluşturulmuş bir kısayola erişmesi ve kısayolu işlemesi gerekebilir. Bu işlem, kısayolu çözümleme olarak adlandırılır.
Aşağıdaki örnekteki uygulama tanımlı ResolveIt işlevi bir kısayolu çözümler. Parametreleri bir pencere tutamacını, kısayol yolunu gösteren bir işaretçiyi ve nesnenin yeni yolunu alan bir arabelleğin adresini içerir. Pencere tutamacı, Kabuğun görüntülemesi gerekebilecek tüm ileti kutuları için üst pencereyi tanımlar. Örneğin, bağlantı paylaşılmayan medyadaysa, ağ sorunları oluşursa, kullanıcının disket eklemesi gerekiyorsa vb. kabuk bir ileti kutusu görüntüleyebilir.
ResolveIt işlevi CoCreateInstance işlevini çağırır ve CoInitialize işlevinin zaten çağrıldığını varsayar. ResolveIt'in bağlantı bilgilerini depolamak için IPersistFile arabirimini kullanması gerektiğini unutmayın. IPersistFile, IShellLink nesnesi tarafından uygulanır. Yol bilgileri alınmadan önce bağlantı bilgileri yüklenmelidir. Bu bilgiler örnekte daha sonra gösterilir. Bağlantı bilgilerinin yüklenememesi, IShellLink::GetPath ve IShellLink::GetDescription üye işlevlerine yapılan çağrıların başarısız olmasına neden olur.
// 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;
}
Dosya Olmayan Nesneye Kısayol Oluşturma
Yazıcı gibi dosya olmayan bir nesnenin kısayolunu oluşturmak, dosyanın yolunu ayarlamak yerine, tanımlayıcı listesini yazıcıya ayarlamanız gerekmesi dışında dosyaya kısayol oluşturmaya benzer. Tanımlayıcı listesini ayarlamak için IShellLink::SetIDList yöntemini çağırın ve tanımlayıcı listesinin adresini belirtin.
Kabuğun ad alanı içindeki her nesnenin bir öğe tanımlayıcısı vardır. Kabuk genellikle öğe tanımlayıcılarını, herhangi bir sayıda öğe tanımlayıcısı içeren null sonlandırılan listeler halinde birleştirir. Öğe tanımlayıcıları hakkında daha fazla bilgi için bkz. Öğe Tanımlayıcıları ve Tanımlayıcı Listeleri.
Genel olarak, yazıcı gibi dosya adı olmayan bir öğenin kısayolunu ayarlamanız gerekiyorsa nesnenin IShellFolder arabirimine yönelik bir işaretçiniz zaten olur. IShellFolder, ad alanı uzantıları oluşturmak için kullanılır.
IShellFolderiçin sınıf tanımlayıcısına sahip olduktan sonra, arabirimin adresini almak için CoCreateInstance işlevini çağırabilirsiniz. Ardından, klasördeki nesneleri listelemek ve aradığınız nesnenin öğe tanımlayıcısının adresini almak için arabirimini çağırabilirsiniz. Son olarak, nesnenin kısayolunu oluşturmak için IShellLink::SetIDList üye işlevine yapılan çağrıda adresi kullanabilirsiniz.