2009-10-27 9 views
5

ngắn viết một hàm bằng tay mà dịch một vài REFIID biết đến tên, chẳng hạn như:Có chức năng OS nào để dịch REFIID thành tên hữu ích không?

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

Có một cuộc gọi hệ thống sẽ trả về một chuỗi gỡ lỗi thích hợp để nổi tiếng (hoặc thậm chí tất cả) REFIIDs?

Trả lời

6

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

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 đó. –

+0

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'. –

+0

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

3

Bạn có thể tra cứu các giao diện được xác định trước trong thanh ghi đăng ký HKCR \ Interface. Bất kỳ thành phần nào cũng có thể đăng ký giao diện tại đó nếu muốn. Tuy nhiên điều này không bắt buộc - thành phần có thể bỏ qua đăng ký này.