Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Klasör Kimliğini Alma bölümünde, bir ad alanı nesnesinin işaretçisini öğe tanımlayıcı listesine (PIDL) almaya yönelik iki yaklaşım ele alındı. Belirgin bir soru şudur: BIR PIDL'niz olduğunda, bununla ne yapabilirsiniz? İlgili soru şudur: Hiçbir yaklaşım işe yaramazsa veya uygulamanız için uygunsa ne olur? Her iki sorunun da yanıtı, ad alanının nasıl uygulandığına daha yakından bakmayı gerektirir. Anahtar, IShellFolder arabirimidir.
- IShellFolder Arabirimi Kullanarak
- Klasör İçeriğini Numaralandırma
- Görünür Adları ve Diğer Özellikleri Belirleme
- Alt Klasörün IShellFolder Arabirimine İşaretçi Alma
- Nesnenin Üst Klasörünü Belirleme
IShellFolder Arabirimini Kullanma
Bu belgenin önceki bölümlerinde ad alanı klasörlerine nesneler adı verildi. Bu noktada, terim gevşek bir anlamda kullanılmış olsa da, aslında katı bir anlamda da geçerlidir. Her ad alanı klasörü bir Bileşen Nesne Modeli (COM) nesnesiyle temsil edilir. Her klasör nesnesi, çok çeşitli görevler için kullanılabilecek bir dizi arabirim sunar. İsteğe bağlı olan bazı arabirimler tüm klasörler tarafından gösterilmeyebilir. Ancak, tüm klasörler temel arabirimini kullanıma sunmalıdır IShellFolder.
Klasör nesnesini kullanmanın ilk adımı, IShellFolder arabirimine bir işaretçi almaktır. IShellFolder, nesnenin diğer arabirimlerine erişim sağlamaya ek olarak, bu bölümde ele alınan birçok ortak görevi işleyen bir dizi yöntemi kullanıma sunar.
Ad alanı nesnesinin IShellFolder arabirimine işaretçi almak için, önce SHGetDesktopFolderçağırmalısınız. Bu işlev, masaüstü ad alanı kökünün IShellFolder arabirimine bir işaretçi döndürür. Masaüstünün IShellFolder arabirimine sahip olduktan sonra devam etmenin çeşitli yolları vardır.
İlgilendiğiniz klasörün PIDL'sine zaten sahipseniz (örneğin, SHGetFolderLocationçağırarak) masaüstünün IShellFolder::BindToObject yöntemini çağırarak IShellFolder arabirimini alabilirsiniz. Dosya sistemi nesnesinin yolunuz varsa, önce masaüstünün IShellFolder::P arseDisplayName yöntemini çağırıp IShellFolder::BindToObjectçağırarak PIDL'sini almanız gerekir. Bu yaklaşımlardan hiçbiri geçerli değilse, ad alanında gezinmek için diğer IShellFolder yöntemlerini kullanabilirsiniz. Daha fazla bilgi için bkz. Navigating the Namespace.
Klasörün İçeriğini Numaralandırma
Genellikle bir klasörle yapmak istediğiniz ilk şey, klasörün ne içerdiğini bulmaktır. Önce klasörün IShellFolder::EnumObjects yöntemini çağırmanız gerekir. Klasör standart bir OLE numaralandırma nesnesi oluşturur ve IEnumIDList arabirimini döndürür. Bu arabirim, klasörün içeriğini numaralandırmak için kullanılabilecekClone, Next, Resetve Skipolmak üzere dört standart yöntemi kullanıma sunar.
Bir klasörün içeriğini numaralandırmak için temel yordam:
- Bir numaralandırma nesnesinin IEnumIDList arabirimine işaretçi almak için IShellFolder::EnumObjectsyönteminiklasörleri çağırın.
- Ayrılmamış bir PIDL'yi IEnumIDList::Nextgeçirin. Ardından PIDL'yi ayırma işlemini üstlenir, ancak artık gerekli olmadığında uygulamanın bunu serbest bırakması gerekir. Next döndüğünde, PIDL yalnızca nesnenin öğe kimliğini ve sonlandırıcı NULL karakterlerini içerir. Başka bir deyişle, tam bir PIDL değil, klasöre göre tek düzeyli bir PIDL'dir.
- Sonraki tüm öğelerin numaralandırıldığını belirtmek için S_FALSE döndürdüğünde 2. adımı yineleyin.
- Numaralandırma nesnesini serbest bırakmak için IEnumIDList::Release çağırın.
Not
Tam veya göreli bir PIDL ile çalışıp çalışmadığınızdan haberdar olmak önemlidir. Bazı işlevler ve yöntemler ikisini de kabul eder, ancak diğerleri yalnızca birini veya diğerini alır.
Kalan üç IEnumIDList yöntemi (Sıfırla , Atla ve Kopyala) klasörün yinelenen numaralandırmalarını yapmanız gerekiyorsa yararlıdır. Numaralandırmayı sıfırlamanıza, bir veya daha fazla nesneyi atlamanıza ve durumunu korumak için numaralandırma nesnesinin bir kopyasını oluşturmanıza olanak sağlar.
Görünen Adları ve Diğer Özellikleri Belirleme
Bir klasörün içerdiği tüm PIDL'leri numaralandırdıktan sonra, bunların ne tür nesneleri temsil ettiğini öğrenebilirsiniz. IShellFolder arabirimi, ikisi burada ele alınan bir dizi yararlı yöntem sağlar. Diğer IShellFolder yöntemleri ve diğer Shell klasör arabirimleri daha sonra ele alınmalıdır.
En kullanışlı özelliklerden biri nesnenin görünen adıdır. Bir nesnenin görünen adını almak için, PIDL'sini IShellFolder::GetDisplayNameOföğesine geçirin. Nesne, ad alanındaki üst klasörün altında herhangi bir yerde bulunabilir, ancak PIDL'sinin klasöre göre olması gerekir.
IShellFolder::GetDisplayNameOf, görünen adı STRRET yapısının bir parçası olarak döndürür. BIR STRRET yapısından görünen adı ayıklamak biraz karmaşık olabileceğinden, Shell bu işi yerine getiren iki işlev sağlar: StrRetToStr ve StrRetToBuf. her iki işlev de STRRET yapısı alır ve görünen adı normal bir dize olarak döndürür. Bunlar yalnızca dizenin ayrılma biçiminde farklılık gösterir.
Görünen adına ek olarak, bir nesnenin klasör olup olmadığı veya taşınıp taşınamayacağı gibi çeşitli öznitelikleri olabilir. Bir nesnenin özelliklerini, PIDL'sini IShellFolder::GetAttributesOf'e geçirerek alabilirsiniz. Özniteliklerin tam listesi oldukça büyük olduğundan ayrıntılar için başvuruyu görmeniz gerekir. GetAttributesOf'a geçirdiğiniz PIDL'nin tek düzeyli olması gerektiğini unutmayın. Özellikle IShellFolder::GetAttributesOf, IEnumIDList::Nexttarafından döndürülen PIDL'leri kabul eder. Bir PIDL dizisi geçirebilirsiniz ve GetAttributesOf dizideki tüm nesnelerin ortak olduğu öznitelikleri döndürür.
Bir nesnenin tam yolunuz veya PIDL'niz varsa, SHGetFileInfo birçok amaç için yeterli olan bir nesne hakkında bilgi almak için basit bir yol sağlar. SHGetFileInfo tam bir yol veya PIDL alır ve ilgili nesne hakkında aşağıdakiler gibi çeşitli bilgiler döndürür:
- Nesnenin görünen adı
- Nesnenin öznitelikleri
- Nesnenin simgelerinin tutamaçları
- Sistem görüntüsü listesinin tanıtıcısı
- Nesnenin simgesini içeren dosyanın yolu
Alt Klasörün IShellFolder Arayüzüne İşaretçi Elde Etme
IShellFolder::GetAttributesOf çağrısı yaparak ve SFGAO_FOLDER bayrağının ayarlanıp ayarlanmadığını denetleyerek klasörünüzün herhangi bir alt klasör içerip içermediğini belirleyebilirsiniz. Bir nesne bir klasörse, bu klasöre bağlanarak size IShellFolder arabirimine yönelik bir işaretçi sağlayabilirsiniz.
Bir alt klasöre bağlanmak için üst klasörün IShellFolder::BindToObject yöntemini çağırın. Bu yöntem alt klasörün PIDL'sini alır ve IShellFolder arabirimine bir işaretçi döndürür. Bu işaretçiye sahip olduktan sonra, alt klasörlerin içeriğini listelemek, özelliklerini belirlemek vb. için IShellFolder yöntemlerini kullanabilirsiniz.
Nesnenin Üst Klasörünü Belirleme
Bir nesnenin PIDL'sine sahipseniz, üst klasörü tarafından kullanıma sunulan arabirimlerden birinin tanıtıcısına ihtiyacınız olabilir. Örneğin, IShellFolder::GetDisplayNameOfkullanarak bir PIDL ile ilişkili görünen adı belirlemek istiyorsanız, önce nesnenin ana nesnesinin IShellFolder arabirimini almanız gerekir. Bunu önceki bölümlerde açıklanan tekniklerle yapmak mümkündür. Ancak, SHBindToParentShell işlevini kullanmak çok daha basit bir yaklaşımdır. Bu işlev bir nesnenin tam PIDL değerini alır ve üst klasörde belirtilen arabirim işaretçisini döndürür. İsteğe bağlı olarak, IShellFolder::GetAttributesOfgibi yöntemlerde kullanılmak üzere öğenin tek düzeyLI PIDL'sini de döndürür.
Aşağıdaki örnek konsol uygulaması, Sistem özel klasörünün PIDL'sini alır ve görünen adını döndürür.
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>
#include <objbase.h>
int main()
{
IShellFolder *psfParent = NULL;
LPITEMIDLIST pidlSystem = NULL;
LPCITEMIDLIST pidlRelative = NULL;
STRRET strDispName;
TCHAR szDisplayName[MAX_PATH];
HRESULT hr;
hr = SHGetFolderLocation(NULL, CSIDL_SYSTEM, NULL, NULL, &pidlSystem);
hr = SHBindToParent(pidlSystem, IID_IShellFolder, (void **) &psfParent, &pidlRelative);
if(SUCCEEDED(hr))
{
hr = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &strDispName);
hr = StrRetToBuf(&strDispName, pidlSystem, szDisplayName, sizeof(szDisplayName));
cout << "SHGDN_NORMAL - " <<szDisplayName << '\n';
}
psfParent->Release();
CoTaskMemFree(pidlSystem);
return 0;
}
Uygulama ilk olarak Sistem klasörünün PIDL'sini almak için SHGetFolderLocation kullanır. Ardından, üst klasörün IShellFolder arabirimine bir işaretçi döndüren SHBindToParentve Sistem klasörünün PIDL'sini üst klasörüne göre çağırır. Ardından, System klasörünün görünen adını almak için üst klasörün IShellFolder::GetDisplayNameOf yöntemini kullanır. GetDisplayNameOfSTRRET yapısı döndürdüğünden, görünen adı normal bir dizeye dönüştürmek için strRetToBufkullanılır. Görünen ad görüntülendikten sonra arayüz işaretçileri serbest bırakılır ve Sistem PIDL'i serbest bırakılır. SHBindToParenttarafından döndürülen göreli PIDL'yi boşaltmamalısınız.