精简版
*.winmd
使用IMetadataImport时如何从文件中获取接口的接口标识符 (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:
但是在使用文档化API时如何获取它?IMetadataImporter
代码
如何启动和运行读取元数据文件的精简版: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 版本,据我所知,它是元数据 API 的唯一 Microsoft 文档) (存档)