2009-10-27 6 views

Antwort

6

Danke für die Antworten. Unten ist das, was ich aufgrund Ihres Feedbacks herausgefunden habe - sehr geschätzt!

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

Verwenden Sie niemals 'catch (...)'. Dafür gibt es viele verschiedene philosophische Gründe, aber wenn Sie einen pragmatischen haben möchten: Um die Prüfung "Designed for Vista" zu bestehen, muss Ihre Anwendung niemals Zugriffsverletzungsausnahmen erfassen. Abhängig von den Einstellungen Ihres Compilers macht 'catch (...)' genau das. –

+0

Verwenden Sie außerdem die Klasse "CComBSTR", um eine OLE-Zeichenfolge (z. B. BSTR) in einer MFC- oder ATL-Anwendung zu verwalten. –

+0

Es gibt keinen Grund, den gesamten Overhead einer OLE-Zeichenfolge aufzurufen. Ja, es gibt Mechanismen dafür, aber na und? Sie können nicht einfach die Art und Weise ändern, wie sie GUIDs ausdrücken, also ist es kein bewegliches Ziel, also kein Risiko, wenn ich meine eigene, effizientere Lösung durchführe. – Mordachai

3

Sie können die vordefinierten Schnittstellen in der Unterstruktur HKCR \ Interface nachschlagen. Jede Komponente kann ihre Schnittstellen dort registrieren, wenn sie dies wünscht. Dies ist jedoch nicht obligatorisch - die Komponente könnte diese Registrierung überspringen.