문제

알려진 refiid를 다음과 같은 이름으로 변환하는 함수를 수동으로 작성하지 않아

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

잘 알려진 (또는 모든) refiids에 대해 합리적인 디버깅 문자열을 반환하는 시스템 호출이 있습니까?

도움이 되었습니까?

해결책

응답에 감사드립니다. 아래는 귀하의 의견을 바탕으로 제가 생각해 낸 것입니다. 대단히 감사합니다!

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;
}

다른 팁

HKCR 인터페이스 레지스트리 서브 트리에서 사전 정의 된 인터페이스를 조회 할 수 있습니다. 원하는 경우 모든 구성 요소가 인터페이스를 등록 할 수 있습니다. 그러나 이것은 필수가 아닙니다. 구성 요소는이 등록을 건너 뛸 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top