2009-10-27 15 views
5

À moins d'écrire une fonction manuelle qui se traduit par quelques REFIID connus des noms, tels que:Existe-t-il une fonction OS pour traduire un REFIID en un nom utile?

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

Y at-il un appel système qui renverrait une chaîne de débogage raisonnable pour bien connus (ou même tous) REFIIDs?

Répondre

6

Merci pour les réponses. Voici ce que j'ai trouvé en fonction de vos commentaires - très apprécié!

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

N'utilisez jamais 'catch (...)'. Il y a beaucoup de raisons philosophiques différentes à cela, mais si vous voulez en avoir une pragmatique: pour passer la vérification "Conçu pour Vista", votre application ne doit jamais attraper des exceptions de violation d'accès. En fonction des paramètres de votre compilateur, 'catch (...)' fait exactement cela. –

+0

De même, pour gérer une chaîne OLE (c'est-à-dire BSTR) dans une application MFC ou ATL, utilisez la classe CComBSTR. –

+0

Il n'y a aucune raison d'invoquer tous les frais généraux d'une chaîne OLE. Oui, il existe des mécanismes pour cela, mais alors? Ils ne peuvent pas simplement changer la façon dont ils expriment les GUID, donc ce n'est pas une cible mouvante, donc pas de risque pris en roulant ma propre solution, plus efficace. – Mordachai

3

Vous pouvez rechercher les interfaces prédéfinies dans le sous-arborescence de registre HKCR \ Interface. Tout composant peut enregistrer ses interfaces s'il le souhaite. Cependant, ceci n'est pas obligatoire - le composant peut ignorer cet enregistrement.