Есть ли функция ОС для перевода REFIID в полезное имя? - PullRequest
5 голосов
/ 27 октября 2009

За исключением написания функции вручную, которая переводит несколько известных REFIID в имена, такие как:

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

Существует ли системный вызов, который вернул бы разумную строку отладки для известных (или даже всех) REFIID?

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

Спасибо за ответы. Ниже то, что я придумал на основе ваших отзывов - очень ценится!

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 голосов
/ 27 октября 2009

Вы можете найти предопределенные интерфейсы в поддереве реестра HKCR \ Interface. Любой компонент может зарегистрировать там свои интерфейсы, если пожелает. Однако это не обязательно - компонент может пропустить эту регистрацию.

...