简短版
在使用IMetadataImport时,如何从*.winmd
文件中获取接口的接口标识符(IID)?
例如:Windows.Globalization.ICalendar: {CA30221D-86D9-40FB-A26B-D44EB7CF08EA}
较长版
Windows.Globalization.ICalendar接口是一个好的示例。其IID为CA30221D-86D9-40FB-A26B-D44EB7CF08EA
。
它在IDL中
您可以在源代码Windows.Globalization.idl
文件中找到它:
[exclusiveto(Windows.Globalization.Calendar)]
[uuid(CA30221D-86D9-40FB-A26B-D44EB7CF08EA)]
[version(0x06020000)]
interface ICalendar : IInspectable
{
//...snip...
}
提示:您不应该解析这些文件。它们被编译成一个*.winmd
程序集,而该数据库是基本事实。
它在头文件中
您可以在windows.globalization.h
文件中找到它,该文件是使用导入工具从*.winmd
生成的:
namespace ABI {
namespace Windows {
namespace Globalization {
MIDL_INTERFACE("CA30221D-86D9-40FB-A26B-D44EB7CF08EA")
ICalendar : public IInspectable
{
//...snip...
}
它甚至在winmd中
您甚至可以在生成的编译后的*.winmd
程序集数据库中找到InterfaceID:
但是当使用文档中记录的IMetadataImporter
API时,我该如何获得它呢?
代码
获取并运行winmd
元数据文件的简化版本,请参阅此处:
// Create your metadata dispenser:
IMetadataDispsener dispener;
MetaDataGetDispenser(CLSID_CorMetaDataDispenser, IMetaDataDispenser, out dispenser);
//Open the winmd file we want to dump
String filename = "C:\Windows\System32\WinMetadata\Windows.Globalization.winmd";
IMetaDataImport reader; //IMetadataImport2 supports generics
dispenser.OpenScope(filename, ofRead, IMetaDataImport, out reader); //"Import" is used to read metadata. "Emit" is used to write metadata.
额外阅读材料
- MSDN 博客:元数据非托管 API (一份旧的 Word 文档的初步 PDF 版本,据我所知,这是 Metadata API 的唯一 Microsoft 文档) (存档)
GetCustomAttributeByName
方法来检索Windows.Foundation.Metadata.GuidAttribute
属性的值,然后解析结果 blob。 - Kenny Kerr