감사합니다. 아래는 내가 귀하의 의견을 토대로 내놓은 것입니다 - 많은 감사드립니다!
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;
}
결코 catch (...)를 사용하지 마십시오. 여러 가지 철학적 인 이유가 있지만 실용적인 솔루션을 원한다면 : "Designed for Vista"검증을 통과하려면 응용 프로그램이 액세스 위반 예외를 절대로 잡을 필요가 없습니다. 컴파일러 설정에 따라'catch (...)'만하면됩니다. –
또한 MFC 또는 ATL 애플리케이션에서 OLE 문자열 (예 : BSTR)을 관리하려면 'CComBSTR'클래스를 사용하십시오. –
OLE 문자열의 모든 오버 헤드를 호출 할 이유가 없습니다. 예, 메커니즘이 있지만 그게 뭐죠? 그들은 이동하여 GUID를 표현하는 방식을 바꿀 수 없으므로 움직이지 않는 대상이므로 내 자신의보다 효율적인 솔루션을 사용하여 위험을 감수하지 않아도됩니다. – Mordachai