2009-10-27 2 views
5

몇 가지 알려진 REFIID를 이름으로 변환하는 함수를 수동으로 작성하는 것의 부족 :REFIID를 유용한 이름으로 변환하는 OS 기능이 있습니까?

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

잘 알려진 (또는 심지어 모든) REFIID에 대해 적절한 디버깅 문자열을 반환하는 시스템 호출이 있습니까?

답변

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

결코 catch (...)를 사용하지 마십시오. 여러 가지 철학적 인 이유가 있지만 실용적인 솔루션을 원한다면 : "Designed for Vista"검증을 통과하려면 응용 프로그램이 액세스 위반 예외를 절대로 잡을 필요가 없습니다. 컴파일러 설정에 따라'catch (...)'만하면됩니다. –

+0

또한 MFC 또는 ATL 애플리케이션에서 OLE 문자열 (예 : BSTR)을 관리하려면 'CComBSTR'클래스를 사용하십시오. –

+0

OLE 문자열의 모든 오버 헤드를 호출 할 이유가 없습니다. 예, 메커니즘이 있지만 그게 뭐죠? 그들은 이동하여 GUID를 표현하는 방식을 바꿀 수 없으므로 움직이지 않는 대상이므로 내 자신의보다 효율적인 솔루션을 사용하여 위험을 감수하지 않아도됩니다. – Mordachai

3

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

관련 문제