Pengantar Namespace Shell
Namespace Shell mengatur sistem file dan objek lain yang dikelola oleh Shell ke dalam satu hierarki terstruktur pohon. Secara konseptual, ini adalah versi sistem file yang lebih besar dan lebih inklusif.
Salah satu tanggung jawab utama Shell adalah mengelola dan menyediakan akses ke berbagai objek yang membentuk sistem. Yang paling banyak dan akrab dari objek ini adalah folder dan file yang berada di drive disk komputer. Namun, Shell mengelola sejumlah sistem nonfile, atau objek virtual juga. Beberapa contoh termasuk:
- Pencetak jaringan
- Komputer berjaringan lainnya
- Panel Kontrol aplikasi
- Keranjang Sampah
Beberapa objek virtual tidak melibatkan penyimpanan fisik sama sekali. Objek printer, misalnya, berisi kumpulan tautan ke printer berjaringan. Objek virtual lainnya, seperti Keranjang Sampah, mungkin berisi data yang disimpan di drive disk, tetapi perlu ditangani secara berbeda dari file normal. Misalnya, objek virtual dapat digunakan untuk mewakili data yang disimpan dalam database. Dalam hal namespace, berbagai item dalam database dapat muncul di Windows Explorer sebagai objek terpisah, meskipun semuanya disimpan dalam satu file disk.
Objek virtual bahkan dapat ditemukan di komputer jarak jauh. Misalnya, untuk memfasilitasi roaming, file dokumen pengguna mungkin disimpan di server. Untuk memberi pengguna akses ke file mereka dari beberapa PC desktop, folder Dokumen Saya di PC desktop yang saat ini mereka gunakan akan menunjuk ke server, bukan hard disk PC desktop. Jalurnya akan mencakup drive jaringan yang dipetakan atau nama jalur UNC.
Seperti sistem file, namespace layanan mencakup dua jenis dasar objek: folder dan file. Objek folder adalah simpul pohon; kontainer adalah kontainer untuk objek file dan folder lainnya. Objek file adalah daun pohon; mereka adalah file disk normal atau objek virtual, seperti tautan printer. Folder yang bukan bagian dari sistem file terkadang disebut sebagai folder virtual.
Seperti folder sistem file, kumpulan folder virtual umumnya bervariasi dari sistem ke sistem. Ada tiga kelas folder virtual:
- Folder virtual standar, seperti Keranjang Sampah, yang ditemukan di semua sistem.
- Folder virtual opsional yang memiliki nama dan fungsionalitas standar, tetapi mungkin tidak ada di semua sistem.
- Folder non-standar yang diinstal oleh pengguna.
Tidak seperti folder sistem file, pengguna tidak dapat membuat folder virtual baru itu sendiri. Mereka hanya dapat menginstal yang dibuat oleh pengembang non-Microsoft. Dengan demikian, jumlah folder virtual biasanya jauh lebih sedikit daripada jumlah folder sistem file. Untuk diskusi tentang cara mengimplementasikan folder virtual, lihat Ekstensi Namespace.
Anda dapat melihat representasi visual tentang bagaimana namespace disusun di Bilah Penjelajah Windows Explorer. Misalnya, cuplikan layar Windows Explorer berikut menunjukkan namespace layanan yang relatif sederhana.
Akar utama hierarki namespace adalah desktop. Tepat di bawah akar adalah beberapa folder virtual seperti Komputer Saya dan Keranjang Sampah.
Sistem file dari berbagai drive disk dapat dilihat sebagai subset dari hierarki namespace yang lebih besar. Akar sistem file ini adalah subfolder folder Komputer Saya. Komputer Saya juga menyertakan akar kandar jaringan yang dipetakan. Simpul lain di pohon, seperti Dokumen Saya, adalah folder virtual.
Sebelum dapat menggunakan objek namespace layanan, Anda harus terlebih dahulu memiliki cara untuk mengidentifikasinya. Objek dalam sistem file bisa memiliki nama seperti MyFile.htm. Karena mungkin ada file lain dengan nama tersebut di tempat lain dalam sistem, mengidentifikasi file atau folder secara unik memerlukan jalur yang sepenuhnya memenuhi syarat seperti "C:\MyDocs\MyFile.htm". Jalur ini pada dasarnya adalah daftar semua folder yang diurutkan dalam jalur dari akar sistem file, C:\, yang diakhpuni dengan file.
Dalam konteks namespace layanan, jalur masih cukup berguna untuk mengidentifikasi objek yang terletak di bagian sistem file dari namespace layanan. Namun, mereka tidak dapat digunakan untuk objek virtual. Sebaliknya, Shell menyediakan sarana identifikasi alternatif yang dapat digunakan dengan objek namespace layanan apa pun.
Dalam folder, setiap objek memiliki ID item, yang setara dengan nama file atau folder fungsional. ID item sebenarnya adalah struktur SHITEMID :
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID, * LPSHITEMID;
Anggota abID adalah pengidentifikasi objek. Panjang abID tidak ditentukan, dan nilainya ditentukan oleh folder yang berisi objek . Karena tidak ada definisi standar tentang bagaimana nilai abID ditetapkan oleh folder, nilai tersebut hanya bermakna bagi objek folder terkait. Aplikasi hanya boleh memperlakukannya sebagai token yang mengidentifikasi objek di folder tertentu. Karena panjang abID bervariasi, anggota cb memegang ukuran struktur SHITEMID , dalam byte.
Karena ID item tidak berguna untuk tujuan tampilan, folder yang berisi objek biasanya menetapkan nama tampilan. Ini adalah nama yang digunakan oleh Windows Explorer ketika menampilkan isi folder. Untuk informasi selengkapnya tentang cara nama tampilan ditangani, lihat Mendapatkan Informasi Dari Folder.
ID item jarang digunakan dengan sendirinya. Biasanya, ini adalah bagian dari daftar ID item, yang melayani tujuan yang sama dengan jalur sistem file. Namun, alih-alih string karakter yang digunakan untuk jalur, daftar ID item adalah struktur ITEMIDLIST . Struktur ini adalah urutan yang diurutkan dari satu atau beberapa ID item, dihentikan oleh NULL dua byte. Setiap ID item dalam daftar ID item sesuai dengan objek namespace. Urutannya mendefinisikan jalur di namespace, seperti jalur sistem file.
Ilustrasi berikut menunjukkan representasi skema struktur ITEMIDLIST yang sesuai dengan C:\MyDocs\MyFile.htm. Nama tampilan setiap ID item ditampilkan di atasnya. Berbagai lebar anggota abID bersifat arbitrer; mereka menggambarkan fakta bahwa ukuran anggota ini dapat bervariasi.
Untuk API Shell, objek namespace biasanya diidentifikasi oleh penunjuk ke struktur ITEMIDLIST mereka, atau penunjuk ke daftar pengidentifikasi item (PIDL). Untuk kenyamanan, istilah PIDL umumnya akan merujuk dalam dokumentasi ini ke struktur itu sendiri daripada penunjuk ke dalamnya.
PIDL yang ditampilkan dalam ilustrasi sebelumnya disebut sebagai PIDL penuh, atau absolut. PIDL lengkap dimulai dari desktop, dan berisi ID item dari semua folder perantara di jalur. Ini berakhir dengan ID item objek diikuti dengan NULL dua byte yang mengakhiri. PIDL lengkap mirip dengan jalur yang sepenuhnya memenuhi syarat dan secara unik mengidentifikasi objek di namespace Shell.
PIDL penuh jarang digunakan. Banyak fungsi dan metode mengharapkan PIDL relatif. Akar PIDL relatif adalah folder, bukan desktop. Seperti jalur relatif, rangkaian ID item yang membentuk struktur menentukan jalur di namespace di antara dua objek. Meskipun tidak secara unik mengidentifikasi objek, mereka biasanya lebih kecil dari PIDL penuh dan cukup untuk banyak tujuan.
PIDL relatif yang paling umum digunakan, PIDL tingkat tunggal, relatif terhadap folder induk objek. Mereka hanya berisi ID item objek dan NULL yang mengakhiri. PIDL multi-level juga digunakan untuk banyak tujuan. Mereka berisi dua ID item atau lebih dan biasanya menentukan jalur dari folder induk ke objek melalui serangkaian satu atau beberapa subfolder. Perhatikan bahwa PIDL tingkat tunggal masih dapat menjadi PIDL yang sepenuhnya memenuhi syarat. Secara khusus, objek desktop adalah turunan dari desktop, sehingga PIDL yang sepenuhnya memenuhi syarat hanya berisi satu ID item.
Seperti yang dibahas dalam Mendapatkan ID Folder, SHELL API menyediakan sejumlah cara untuk mengambil PIDL objek. Setelah Anda memilikinya, Anda biasanya hanya menggunakannya untuk mengidentifikasi objek ketika Anda memanggil fungsi dan metode Shell API lainnya. Dalam konteks ini, konten internal PIDL buram dan tidak relevan. Untuk tujuan diskusi ini, anggapLAH PIDL sebagai token yang mewakili objek namespace tertentu, dan fokus pada cara menggunakannya untuk tugas umum.
Meskipun PIDL memiliki beberapa kesamaan dengan jalur, menggunakannya membutuhkan pendekatan yang agak berbeda. Perbedaan utama adalah cara mengalokasikan dan membatalkan alokasi memori untuk mereka.
Seperti string yang digunakan untuk jalur, memori harus dialokasikan untuk PIDL. Jika aplikasi membuat PIDL, aplikasi harus mengalokasikan memori yang cukup untuk struktur ITEMIDLIST . Untuk sebagian besar kasus yang dibahas di sini, Shell membuat PIDL dan menangani alokasi memori. Terlepas dari apa yang dialokasikan PIDL, aplikasi biasanya bertanggung jawab untuk membatalkan alokasi PIDL ketika tidak lagi diperlukan.
Gunakan fungsi CoTaskMemAlloc untuk mengalokasikan PIDL, dan fungsi CoTaskMemFree untuk membatalkan alokasinya.