Menavigasi dalam Namespace
Anda sekarang memiliki semua elemen penting yang diperlukan untuk menjelajahi di mana saja di namespace. Cara paling sederhana untuk memulai adalah dengan meminta aplikasi Anda memanggil SHGetDesktopFolder untuk mengambil antarmukaIShellFolderdesktop. Kemudian, untuk menavigasi ke bawah melalui namespace layanan, aplikasi Anda dapat mengikuti langkah-langkah berikut:
- Sebutkan isi folder.
- Tentukan objek mana yang merupakan subfolder, dan pilih objek.
- Ikat ke subfolder untuk mengambil antarmuka IShellFolder.
Ulangi langkah-langkah ini sesering yang diperlukan untuk mencapai target.
Contoh Sederhana Navigasi Namespace
Bagian kode sampel berikut adalah aplikasi konsol sederhana yang menggambarkan sejumlah prosedur yang dibahas di bagian sebelumnya. Pemeriksaan kesalahan telah dihilangkan untuk kejelasan. Aplikasi melakukan tugas-tugas berikut:
- Mengambil antarmuka IShellFolderdari folder Program Files(Menggunakan Antarmuka IShellFolder).
- Menghitung konten folder (Menghitung Konten Folder).
- Menentukan semua nama tampilan dan mencetaknya (Menentukan Nama Tampilan dan Properti Lain).
- Mencari subfolder (Menemukan Pointer ke Antarmuka IShellFolder dari Subfolder).
- Mengikat ke subfolder pertama yang ditemukannya (Mendapatkan Pointer ke Antarmuka IShellFolder Subfolder).
- Mencetak nama tampilan objek dalam subfolder.
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>
main()
{
LPITEMIDLIST pidlProgFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfFirstFolder = NULL;
IShellFolder *psfDeskTop = NULL;
IShellFolder *psfProgFiles = NULL;
LPENUMIDLIST ppenum = NULL;
ULONG celtFetched;
HRESULT hr;
STRRET strDispName;
TCHAR pszDisplayName[MAX_PATH];
ULONG uAttr;
CoInitialize( NULL );
hr = SHGetFolderLocation(NULL, CSIDL_PROGRAM_FILES, NULL, 0, &pidlProgFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlProgFiles, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
psfDeskTop->Release();
hr = psfProgFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfProgFiles->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
cout << pszDisplayName << '\n';
if(!psfFirstFolder)
{
uAttr = SFGAO_FOLDER;
psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
if(uAttr & SFGAO_FOLDER)
{
hr = psfProgFiles->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
}
}
CoTaskMemFree(pidlItems);
}
cout << "\n\n";
ppenum->Release();
if(psfFirstFolder)
{
hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfFirstFolder->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
cout << pszDisplayName << '\n';
CoTaskMemFree(pidlItems);
}
}
ppenum->Release();
CoTaskMemFree(pidlProgFiles);
psfProgFiles->Release();
psfFirstFolder->Release();
CoUninitialize();
return 0;
}