2009-07-07 6 views
1

Je veux obtenir l'icône du système d'un dossier spécifié, mais peut-être la seule façon de récupérer l'icône est d'utiliser la méthode SHGetFileInfo(). Le premier paramètre de la méthode SHGetFileInfo() est un pointeur de LPITEMIDLIST.Comment obtenir un pointeur LPITEMIDLIST en fonction du chemin d'un dossier?

Si je n'ai que le chemin absolu du dossier, comment puis-je obtenir le pointeur en fonction du chemin?

Répondre

5

SHParseDisplayName().

Bienvenue dans le monde merveilleux des PIDL.

Vous pouvez lire plus à Introduction to the Shell Namespace, mais fondamentalement, un PIDL est un pointeur vers une liste d'ID d'élément. Vous pouvez considérer cela comme une liste liée dans la mémoire contiguë, mais au lieu que chaque nœud ait un pointeur vers le nœud suivant, vous avez à la place le membre cb qui est le nombre d'octets qui contient l'élément, donc vous pouvez l'ajouter à l'adresse de base pour obtenir l'article suivant. Les IDLists sont terminés avec un élément avec {cb = 0, abID = NULL}.

Alors, qu'y a-t-il dans ces lits magiques? Fondamentalement, vous ne vous souciez pas et ne pouvez pas savoir. Toute implémentation IShellFolder peut créer un nouveau type d'ID pour représenter son type d'élément dans l'espace de noms du shell. La vue de base du système de fichiers que le Shell implémente stocke juste les parties du chemin dans ces listes, donc vous avez quelque chose comme "c: \" dans le premier "Utilisateurs" dans le suivant, etc. En réalité, ils sont sérialisés structs (ou classes) pouvant contenir plus de données. Mais ils peuvent également représenter des imprimantes, des partages réseau, des recherches dans les bases de données (pour les dossiers de recherche, les piles, etc.). Tout ce que vous devez vraiment savoir, c'est que vous pouvez demander à IShellFolders de vous donner un PIDL qui représente les éléments qu'ils contiennent, et plus tard vous pouvez leur donner PIDL, ainsi que d'autres fonctions et interfaces Shell, et ils savent comment faire face à eux. Ce que SHParseDisplayName() fait essentiellement (je pense) passe par le registre recherchant toutes les implémentations IShellFolder enregistrées et leur demande s'ils savent quoi faire avec la chaîne que vous passez, et le premier à gérer rend le PIDL et le donne arrière.

+0

Merci beaucoup! J'ai récemment rencontré le concept de PIDL. Pouvez-vous recommander des articles qui me l'expliquent? – quantity

Questions connexes