मैंने पाया कि आप अपने आईपर्सिस्टफोल्डर 2 के लिए एक आईशेलफोल्डर से पूछ सकते हैं, जिसमें GetCurFolder() है, जो अपना पूर्ण पीआईडीएल देता है। मैं बस डेस्कटॉप के लिए IShellFolder का उपयोग तुलना आईडी() को यह निर्धारित करने के लिए कर सकता हूं कि वे बराबर हैं या नहीं। SHGetIDListFromObject पर देखते हुए मुझे इसकी रूपरेखा मिली। मैं सिर्फ उस फ़ंक्शन का उपयोग नहीं कर सका, क्योंकि इसका Vista, और मुझे XP संगतता की आवश्यकता है।
यह ऐसे काम करता का चित्र है (यह मानते हुए कि आप एक ifolder_desktop, और ifolder_other, जो IShellFolder संकेत दिए गए हैं है Pidl एक सरल सहायक सुनिश्चित करता है कि IDLISTs ठीक से पुनः आवंटित की जाती रही है।):
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);
मामले में किसी को भी मेरी सरल 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. सही है, लेकिन फाइल सिस्टम शेल स्पेस में अधिकांश ऑब्जेक्ट्स के लिए अंतर्निहित सत्य है। और हालांकि किसी दिए गए फ़ोल्डर में एकाधिक लिंक, जंक्शन, इत्यादि होना संभव है, वहां केवल एक वास्तविक मूल फ़ोल्डर हो सकता है। फाइल सिस्टम की परिभाषा के द्वारा यह सच है। यह हमेशा ऐसा रहा है, और इस सत्य की पुष्टि करने के लिए SHBindToParent है। 2. ऐसा नहीं। कोई भी SHheetDesktopFolder से सीधे IShellFolder को चालू कर सकता है। किसी भी दर पर, यह अक्सर सिस्टम डिज़ाइन किया गया है जो अंततः विफल होने पर एक ही रास्ता जा सकता है। एक से दूसरे में परिवर्तित करने की क्षमता अधिक लचीला और मजबूत है। – Mordachai
1. तो क्या होगा अगर कुछ फाइल सिस्टम की सीमाएं हों। शैल नेमस्पेस को अधिक सामान्य केस व्यक्त करने के लिए डिज़ाइन किया गया था। 2. 1 विशेष मामले को इंगित करने के लिए धन्यवाद। बहुत चालाक। –