2009-11-19 12 views
7

यदि मेरे पास IShellFolder इंटरफ़ेस पॉइंटर है। मैं अपनी पीआईडीएल कैसे प्राप्त कर सकता हूं?किसी IShellFolder के PIDL को कैसे प्राप्त करें

मैं देख सकता हूं कि अपने बच्चों को कैसे गिनना है, और मैं देख सकता हूं कि किसी भी दो बच्चों की तुलना करने के लिए इसका उपयोग कैसे किया जाए। लेकिन मुझे अपना खुद का पिडल कैसे मिल सकता है?

मैं पूछता हूँ क्योंकि मैं जानना चाहते हैं:

इस IShellFolder == एक और IShellFolder

मैं IShellFolder::CompareIDs() का उपयोग कर सकते है, लेकिन मैं दोनों फ़ोल्डरों की आईडी करना होगा।

उत्तर

6

मैंने पाया कि आप अपने आईपर्सिस्टफोल्डर 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

Mordachai के जवाब सही हो सकता है, लेकिन मेरे लिए इस क्वेरी दो मोर्चों पर कोई मतलब नहीं है:

  1. मुझे विश्वास नहीं है कि एक प्रकाशित दस्तावेज़ है जिसमें कहा गया है कि एक आईशेलफोल्डर के पास केवल एक माता-पिता हो सकता है। किसी भी विशेष खोल फ़ोल्डर के कई तरीके हो सकते हैं। नियंत्रण कक्ष, मेरे कंप्यूटर के माध्यम से, प्रारंभ मेनू के माध्यम से, और फ़ाइल सिस्टम में कहीं भी पहुंच योग्य है, जिससे आप जंक्शन बिंदु बनाते हैं। ऐसा लगता है कि शेल टीमों का आकस्मिक इरादा आईशेलफोल्डर उदाहरण दिया गया था, इससे बाहरी उपयोगकर्ताओं से कोई फर्क नहीं पड़ता कि इसका मनमाना स्थान क्या हुआ।

  2. साथ ही, कि एक IShellFolder निश्चित रूप से किसी भी आवेदन को दर्शाता है एक PIDL के एक होने ज्ञान से वैसा ही किया। यदि आपके ऐप ने आईशेलफोल्डर के पथ के बारे में परवाह की है तो यह पहले से ही उस जानकारी को है। आपने इसे कैसे खोला? (और क्यों खोल टीम की मदद करने के लिए एप्लिकेशन की स्वयं डेटा का ट्रैक रखने के लिए एक विधि जोड़ना चाहिए?)

+0

1. सही है, लेकिन फाइल सिस्टम शेल स्पेस में अधिकांश ऑब्जेक्ट्स के लिए अंतर्निहित सत्य है। और हालांकि किसी दिए गए फ़ोल्डर में एकाधिक लिंक, जंक्शन, इत्यादि होना संभव है, वहां केवल एक वास्तविक मूल फ़ोल्डर हो सकता है। फाइल सिस्टम की परिभाषा के द्वारा यह सच है। यह हमेशा ऐसा रहा है, और इस सत्य की पुष्टि करने के लिए SHBindToParent है। 2. ऐसा नहीं। कोई भी SHheetDesktopFolder से सीधे IShellFolder को चालू कर सकता है। किसी भी दर पर, यह अक्सर सिस्टम डिज़ाइन किया गया है जो अंततः विफल होने पर एक ही रास्ता जा सकता है। एक से दूसरे में परिवर्तित करने की क्षमता अधिक लचीला और मजबूत है। – Mordachai

+0

1. तो क्या होगा अगर कुछ फाइल सिस्टम की सीमाएं हों। शैल नेमस्पेस को अधिक सामान्य केस व्यक्त करने के लिए डिज़ाइन किया गया था। 2. 1 विशेष मामले को इंगित करने के लिए धन्यवाद। बहुत चालाक। –

6

क्या या तो क्रिस या मोर्देचाई # 1 पर लिखता है वैसे भी बात करने के लिए नहीं है। सवाल शैल नेमस्पेस में ऑब्जेक्ट्स के बारे में नहीं है, लेकिन उन ऑब्जेक्ट्स के बारे में है जिनके पास IShellFolder इंटरफ़ेस है। एक आईशेलफोल्डर इंटरफ़ेस का अधिग्रहण स्वयं शैल नेमस्पेस में उपस्थिति का संकेत नहीं देता है। मूल प्रश्न खराब गठित है, क्योंकि यह मानता है कि एक आईशेलफोल्डर इंटरफ़ेस वाले ऑब्जेक्ट में "अपना स्वयं का पीआईडीएल" होना चाहिए।

सबसे अच्छा आप कर सकते हैं, मुझे लगता है, जैसा कि मोर्दचाई सुझाव देता है: देखें कि ऑब्जेक्ट में आईपर्सिस्टफोल्डर 2 इंटरफ़ेस भी है। इस इंटरफेस का उद्देश्य शेल नेमस्पेस में ऑब्जेक्ट को ठीक करना है, जो बदले में फ़ोल्डर को लगातार बना देता है। प्रकाशित प्रलेखन की अनुपस्थिति से अनुमान लगाने के बजाय, माइक्रोसॉफ्ट वास्तव में आईपर्सिस्टफोल्डर और आईपर्सिस्टफोल्डर 2 इंटरफेस और आरंभिक और GetCurFolder विधियों के बारे में क्या कहता है, देखें।सबसे विशेष रूप से, "आपको इस इंटरफ़ेस को कार्यान्वित करने की आवश्यकता है ताकि शैल फ़ोल्डर ऑब्जेक्ट की ITEMIDLIST को पुनर्प्राप्त किया जा सके।"

# 2 पर, मुझे डर है कि क्रिस निश्चित रूप से सही नहीं है। एक आईएसएचएलफ़ोल्डर निश्चित रूप से पीआईडीएल के बिना प्राप्त किया जा सकता है। कंट्रोल पैनल, जिसे क्रिस ने # 1 के लिए पेश किया, # 2 के लिए एक तैयार काउंटर उदाहरण प्रदान करता है। CoCreateInstance को बस CLSID_ControlPanel और IIS_IShellFolder फ़ीड करें। आपको कभी भी "पीआईडीएल का ज्ञान रखने" के बिना नियंत्रण कक्ष का पूरी तरह उपयोग करने योग्य त्वरण मिलता है। SHELL32 में लागू कुछ अन्य रचनात्मक खोल फ़ोल्डर्स हैं, और कोई भी डीएलएल किसी अन्य संख्या को स्थापित कर सकता है।

4

मैं SHGetIDListFromObject फ़ंक्शन का उल्लेख करना भूल गया।

यह केवल विंडोज विस्टा और उच्चतर में उपलब्ध है। यह दस्तावेज होने का लाभ है, यद्यपि कमजोर है। आप my own documentation से, ज़्यादा विस्तार से अधिक जानकारी प्राप्त करते हैं। इससे पता चलता है कि माइक्रोसॉफ्ट शैल नेमस्पेस में किसी ऑब्जेक्ट के लिए मनमाने ढंग से इंटरफ़ेस पॉइंटर के लिए पीआईडीएल प्राप्त करने के दो और तरीके जानता है।

+0

लिंक और विवरण के लिए धन्यवाद। मुझे याद नहीं है कि अगर मैं उस समारोह पर ठोकर खा रहा हूं, लेकिन मैं XP संगतता को बनाए रखने के लिए प्रतिबंधित हूं (हालांकि ऐसा लगता है जैसे मैं shell32.dll के लिए एक गतिशील लिंक का उपयोग कर सकता था)। – Mordachai