Ich habe festgestellt, dass Sie eine IShellFolder für IPersistFolder2 abfragen können, die GetCurFolder() hat, die ihre absolute PIDL zurückgibt. Ich könnte dann einfach den IShellFolder für den Desktop zu CompareIDs() verwenden, um festzustellen, ob sie gleich sind. Ich habe die Umrisse gefunden, während ich auf SHGetIDListFromObject schaute. Ich könnte diese Funktion nicht einfach benutzen, weil Vista, und ich brauche XP-Kompatibilität.
Hier ist eine Skizze, wie es funktioniert (vorausgesetzt, Sie eine ifolder_desktop haben, und ifolder_other, die Zeiger IShellFolder sind PIDL ist ein einfacher Helfer, die IDLISTs werden ausgeplant richtig stellt sicher, dass.):
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);
Bei jemand interessiert sich für meine einfache PIDL Klasse:
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. True, aber das Dateisystem ist die zugrunde liegende Wahrheit für die meisten Objekte im Shell-Raum. Und obwohl es möglich ist, mehrere Links, Junctions usw. zu einem bestimmten Ordner zu haben, kann es nur einen tatsächlichen übergeordneten Ordner geben. Es ist definitionsgemäß das Dateisystem. Das war schon immer so, und es gibt SHBindToParent, der diese Wahrheit bestätigt. 2. Nicht so. Man kann einen IShellFolder direkt aus SHGetDesktopFolder erstellen. Auf jeden Fall ist es oft Systeme entworfen, die nur einen Weg gehen können, die letztlich scheitern. Die Fähigkeit, von einem zum anderen zu konvertieren, ist flexibler und robuster. – Mordachai
1. Also, wenn einige Dateisysteme Grenzen haben. Der Shell-Namespace wurde entworfen, um den allgemeineren Fall auszudrücken. 2. Danke für den Hinweis auf den 1 Sonderfall. Sehr schlau. –