Cảm ơn bạn đã trả lời. Dưới đây là những gì tôi đưa ra dựa trên phản hồi của bạn - được đánh giá cao!
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;
}
Không bao giờ, sử dụng 'catch (...)'. Có nhiều lý do triết học khác nhau cho điều đó, nhưng nếu bạn muốn có một lý do thực dụng: để vượt qua xác minh "Được thiết kế cho Vista", ứng dụng của bạn cần không bao giờ bắt được ngoại lệ vi phạm truy cập. Tùy thuộc vào các thiết lập trình biên dịch của bạn, 'catch (...)' thực hiện điều đó. –
Ngoài ra, để quản lý chuỗi OLE (tức là BSTR) trong ứng dụng MFC hoặc ATL, hãy sử dụng lớp 'CComBSTR'. –
Không có lý do gì để gọi tất cả các chi phí của một chuỗi OLE. Có, có cơ chế cho nó, nhưng vì vậy những gì? Họ không thể chỉ đi và thay đổi cách họ thể hiện GUID, vì vậy nó không phải là một mục tiêu di chuyển, vì vậy không có rủi ro bằng cách lăn giải pháp của riêng tôi, hiệu quả hơn. – Mordachai