J'ai trouvé que vous pouvez interroger un IShellFolder pour son IPersistFolder2, qui a GetCurFolder(), qui retourne son PIDL absolu. Je pourrais alors simplement utiliser le IShellFolder pour le bureau à CompareIDs() pour déterminer s'ils sont égaux. J'ai trouvé les contours de tout cela en regardant SHGetIDListFromObject. Je ne pouvais pas simplement utiliser cette fonction, parce que sa Vista, et j'ai besoin de la compatibilité XP.
Voici un croquis de la façon dont il fonctionne (en supposant que vous avez un ifolder_desktop et ifolder_other, qui sont des pointeurs IShellFolder Pidl est une aide simple qui assure que les IDLISTs sont désallouées correctement.):
CComQIPtr<IPersistFolder2> ipf2_desktop(ifolder_desktop);
CComQIPtr<IPersistFolder2> ipf2_folder(ifolder_other);
Pidl pidl_desktop, pidl_folder;
VERIFY(SUCCEEDED(ipf2_desktop->GetCurFolder(pidl_desktop)));
VERIFY(SUCCEEDED(ipf2_folder->GetCurFolder(pidl_folder)));
HRESULT hr = ifolder_desktop->CompareIDs(NULL, pidl_desktop, pidl_folder);
pCmdUI->Enable(SUCCEEDED(hr) && HRESULT_CODE(hr) != 0);
En cas quelqu'un est intéressé par ma classe simple Pidl:
class Pidl
{
public:
// create empty
Pidl() : m_pidl(NULL) { }
// create one of specified size
explicit Pidl(size_t size) : m_pidl(Pidl_Create(size)) {}
// create a copy of a given PIDL
explicit Pidl(const ITEMIDLIST * pidl) : m_pidl(Pidl_Copy(pidl)) {}
// create an absolute PIDL from a parent + child
Pidl(const ITEMIDLIST_ABSOLUTE * pParent, const ITEMIDLIST_RELATIVE * pChild) : m_pidl(Pidl_Concatenate(pParent, pChild)) { }
// return our PIDL for general use (but retain ownership of it)
operator const ITEMIDLIST *() { return m_pidl; }
// return a pointer to our pointer, for use in functions that assign to a PIDL
operator ITEMIDLIST **()
{
free();
return &m_pidl;
}
// release ownership of our PIDL
ITEMIDLIST * release()
{
ITEMIDLIST * pidl = m_pidl;
m_pidl = NULL;
return pidl;
}
void free()
{
if (m_pidl)
//Pidl_Free(m_pidl);
ILFree(m_pidl);
}
// automatically free our pidl (if we have one)
~Pidl()
{
free();
}
private:
ITEMIDLIST * m_pidl;
};
1. Vrai, mais le système de fichiers est la vérité sous-jacente pour la plupart des objets dans l'espace shell. Et bien qu'il soit possible d'avoir plusieurs liens, jonctions, etc., vers un dossier donné, il ne peut y avoir qu'un seul dossier parent réel. C'est vrai par définition du système de fichiers. Cela a toujours été le cas, et il y a SHBindToParent pour corroborer cette vérité. 2. Ce n'est pas le cas. On peut instancier un IShellFolder directement à partir de SHGetDesktopFolder. Quoi qu'il en soit, ce sont souvent des systèmes conçus qui ne peuvent aller que d'une seule façon et finalement échouer. La possibilité de convertir de l'un à l'autre est plus flexible et robuste. – Mordachai
1. Alors, que se passe-t-il si certains systèmes de fichiers ont des limites? L'espace de nommage du shell a été conçu pour exprimer le cas plus général. 2. Merci d'avoir signalé le cas particulier. Très intelligent. –