いくつかの既知のREFIIDを次のような名前に変換する関数を手動で作成することはできません。
if (riid == IID_IUnknown) return "IUnknown";
if (riid == IID_IShellBrowser) return "IShellBrowser";
...
よく知られている(またはすべての)REFIIDに対して妥当なデバッグ文字列を返すシステムコールはありますか?
いくつかの既知のREFIIDを次のような名前に変換する関数を手動で作成することはできません。
if (riid == IID_IUnknown) return "IUnknown";
if (riid == IID_IShellBrowser) return "IShellBrowser";
...
よく知られている(またはすべての)REFIIDに対して妥当なデバッグ文字列を返すシステムコールはありますか?
回答ありがとうございます。以下はあなたのフィードバックに基づいて私が思いついたものです-大いに感謝します!
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\Interfaceレジストリサブツリーで事前定義されたインターフェイスを検索できます。必要に応じて、どのコンポーネントもそのインターフェイスをそこに登録できます。ただし、これは必須ではありません。コンポーネントはこの登録をスキップする場合があります。