Bagikan melalui


Pengantar Namespace Shell

Namespace Shell mengatur sistem file dan objek lain yang dikelola oleh Shell ke dalam hierarki terstruktur pohon tunggal. Secara konseptual, ini adalah versi sistem file yang lebih besar dan lebih inklusif.

Perkenalan

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 juga mengelola sejumlah objek non-file sistem, atau objek virtual . Beberapa contohnya meliputi:

  • Printer jaringan
  • Komputer jaringan lainnya
  • Aplikasi Panel Kontrol
  • 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 pada PC desktop yang saat ini mereka gunakan akan menunjuk ke server, bukan hard disk PC desktop. Jalurnya akan mencakup drive jaringan terpetakan atau nama jalur UNC.

Seperti sistem file, namespace menyertakan dua jenis dasar objek: folder dan file. Objek folder adalah simpul pohon; mereka adalah kontainer untuk objek file dan folder lainnya. Objek file adalah daun dari pohon; mereka adalah file disk yang 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. Jumlah folder virtual dengan demikian biasanya jauh lebih sedikit daripada jumlah folder sistem file. Untuk diskusi tentang cara menerapkan 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.

sebuah tampilan dari namespace shell

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 menjadi subset hierarki namespace yang lebih besar. Akar sistem berkas ini adalah subfolder dari folder Komputer Saya. Komputer Saya juga menyertakan root dari drive jaringan yang dipetakan. Simpul lain di pohon, seperti Dokumen Saya, adalah folder virtual.

Mengidentifikasi Objek Namespace

Sebelum dapat menggunakan objek namespace, Anda harus terlebih dahulu memiliki cara untuk mengidentifikasinya. Objek dalam sistem file dapat memiliki nama seperti MyFile.htm. Karena mungkin ada file lain dengan nama tersebut di tempat lain dalam sistem, secara unik mengidentifikasi file atau folder 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 diakhir dengan file.

Dalam konteks namespace, jalur masih cukup berguna untuk mengidentifikasi objek yang terletak di bagian sistem file dari namespace. Namun, mereka tidak dapat digunakan untuk objek virtual. Sebagai gantinya, Shell menyediakan sarana identifikasi alternatif yang dapat digunakan dengan objek namespace apa pun.

ID Barang

Dalam folder, setiap objek memiliki ID item , yang setara dengan nama file atau folder fungsional. ID item sebenarnya adalah strukturSHITEMID:

typedef struct _SHITEMID { 
    USHORT cb; 
    BYTE   abID[1]; 
} SHITEMID, * LPSHITEMID; 

Anggota abID merupakan 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 menyimpan 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 penanganan nama tampilan, lihat mendapatkan informasi dari folder.

Daftar ID Item

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 strukturITEMIDLIST. Struktur ini adalah urutan yang diurutkan dari satu atau beberapa ID item, dihentikan oleh dua byte NULL. 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 strukturITEMIDLIST yang sesuai dengan C:\MyDocs\MyFile.htm. Nama tampilan setiap ID item ditampilkan di atasnya. Lebar abID yang bervariasi adalah sewenang-wenang; hal ini menggambarkan fakta bahwa ukuran anggota ini dapat berbeda-beda.

sebuah ilustrasi skema pidl

PIDL

Untuk API Shell, objek namespace biasanya diidentifikasi oleh penunjuk ke struktur ITEMIDLIST, atau penunjuk ke daftar pengidentifikasi item (PIDL). Untuk kenyamanan, istilah PIDL dalam dokumentasi ini umumnya akan merujuk pada struktur itu sendiri daripada pada penunjuknya.

PIDL yang ditampilkan dalam ilustrasi sebelumnya disebut sebagai penuh , atau absolut , PIDL. PIDL penuh dimulai dari desktop, dan berisi ID item dari semua folder perantara di dalam jalur. Ini berakhir dengan ID item objek diikuti dengan dua byte penanda akhir NULL. 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 halnya jalur relatif, rangkaian ID item yang membentuk struktur menentukan jalur di namespace antara dua objek. Meskipun mereka tidak mengidentifikasi objek secara unik, 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 karakter penutup NULL. PIDL multi-tingkat juga digunakan untuk banyak tujuan. Mereka berisi dua atau lebih ID item dan biasanya menentukan jalur dari folder induk ke sebuah objek melalui satu atau lebih subfolder. Perhatikan bahwa PIDL tingkat tunggal masih dapat menjadi PIDL yang sepenuhnya memenuhi kriteria. 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, API Shell menyediakan sejumlah cara untuk mengambil PIDL objek. Setelah memilikinya, Anda biasanya hanya menggunakannya untuk mengidentifikasi objek saat 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.

Mengalokasikan PIDL

Meskipun PIDL memiliki beberapa kesamaan dengan jalur, menggunakannya membutuhkan pendekatan yang agak berbeda. Perbedaan utama adalah cara mengalokasikan dan menghapus alokasi memori untuk mereka.

Seperti string yang digunakan untuk menentukan jalur, memori harus dialokasikan untuk PIDL. Jika aplikasi membuat PIDL, aplikasi harus mengalokasikan memori yang memadai untuk strukturITEMIDLIST. Untuk sebagian besar kasus yang dibahas di sini, Shell membuat PIDL dan menangani alokasi memori. Terlepas dari siapa yang mengalokasikan PIDL, aplikasi biasanya bertanggung jawab untuk melepaskan alokasi PIDL ketika tidak lagi diperlukan.

Gunakan fungsiCoTaskMemAlloc untuk mengalokasikan PIDL, dan fungsiCoTaskMemFreeuntuk membatalkan alokasinya.