2009-10-27 5 views
5

मैन्युअल रूप से एक फ़ंक्शन लिखने का छोटा जो कुछ ज्ञात REFIID को नामों में अनुवाद करता है, जैसे:एक आरईएफआईआईडी को एक सहायक नाम में अनुवाद करने के लिए कोई ओएस फ़ंक्शन है?

if (riid == IID_IUnknown) return "IUnknown"; 
if (riid == IID_IShellBrowser) return "IShellBrowser"; 
... 

क्या कोई सिस्टम कॉल है जो अच्छी तरह से ज्ञात (या यहां तक ​​कि सभी) REFIIDs के लिए उचित डीबगिंग स्ट्रिंग वापस कर देगी?

उत्तर

6

प्रतिक्रियाओं के लिए धन्यवाद। नीचे मैं आपकी प्रतिक्रिया के आधार पर आया था - बहुत सराहना की!

CString ToString(const GUID & guid) 
{ 
    // could use StringFromIID() - but that requires managing an OLE string 
    CString str; 
    str.Format(_T("%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"), 
     guid.Data1, 
     guid.Data2, 
     guid.Data3, 
     guid.Data4[0], 
     guid.Data4[1], 
     guid.Data4[2], 
     guid.Data4[3], 
     guid.Data4[4], 
     guid.Data4[5], 
     guid.Data4[6], 
     guid.Data4[7]); 
    return str; 
} 

CString GetNameOf(REFIID riid) 
{ 
    CString name(ToString(riid)); 
    try 
    { 
     // attempt to lookup the interface name from the registry 
     RegistryKey::OpenKey(HKEY_CLASSES_ROOT, "Interface", KEY_READ).OpenSubKey("{"+name+"}", KEY_READ).GetDefaultValue(name); 
    } 
    catch (...) 
    { 
     // use simple string representation if no registry entry found 
    } 
    return name; 
} 
+3

कभी भी, 'पकड़ (...) 'का उपयोग न करें। इसके लिए कई अलग-अलग दार्शनिक कारण हैं, लेकिन यदि आप व्यावहारिक होना चाहते हैं: "Vista के लिए डिज़ाइन" सत्यापन पास करने के लिए, आपके एप्लिकेशन को उल्लंघन उल्लंघन अपवादों को कभी भी पकड़ने की आवश्यकता नहीं है। आपके कंपाइलर सेटिंग्स के आधार पर, 'पकड़ें (...)' बस यही करता है। –

+0

इसके अलावा, एक एमएफसी या एटीएल अनुप्रयोग में ओएलई स्ट्रिंग (यानी बीएसटी) का प्रबंधन करने के लिए, 'CComBSTR' कक्षा का उपयोग करें। –

+0

ओएलई स्ट्रिंग के सभी ओवरहेड को आमंत्रित करने का कोई कारण नहीं है। हां, इसके लिए तंत्र हैं, लेकिन क्या? वे सिर्फ GUID को व्यक्त करने के तरीके को नहीं बदल सकते हैं और बदल सकते हैं, इसलिए यह एक चलती लक्ष्य नहीं है, इसलिए अपना खुद का, अधिक कुशल समाधान रोल करके कोई जोखिम नहीं लिया गया है। – Mordachai

3

आप HKCR \ Interface रजिस्ट्री उप-में पूर्वनिर्धारित इंटरफेस देख सकते हैं। यदि कोई चाहें तो कोई भी घटक अपने इंटरफेस को पंजीकृत कर सकता है। हालांकि यह अनिवार्य नहीं है - घटक इस पंजीकरण को छोड़ सकता है।

संबंधित मुद्दे