【发布时间】:2019-07-13 10:07:30
【问题描述】:
短版
在使用 IMetadataImport 时,如何从 *.winmd 文件中获取接口的接口标识符 (IID)?
例如Windows.Globalization.ICalendar:{CA30221D-86D9-40FB-A26B-D44EB7CF08EA}
加长版
good example 是 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 时如何获取它?
代码
abridged version 如何启动并运行读取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 博客:Metadata Unmanaged API (据我所知,旧 Word 文档的初步 PDF 版本是元数据 API 的唯一 Microsoft 文档) (@ 987654325@)
【问题讨论】:
-
您需要调用
GetCustomAttributeByName来检索Windows.Foundation.Metadata.GuidAttribute属性的值,然后解析生成的blob。
标签: winapi com windows-runtime midl winmd