【问题标题】:How to get Interfaces belongs to IID's, IConnectionPoint, IConnectionPointContainer in ANSI C如何在 ANSI C 中获取属于 IID、IConnectionPoint、IConnectionPointContainer 的接口
【发布时间】:2014-08-14 18:09:00
【问题描述】:

我在 IConnectionPoint 和 IConnectionPointContainer 的帮助下创建了客户端和 COM 对象之间的连接。

data->pApp->lpVtbl->QueryInterface(data->pApp, &IID_IUnknown, (void**)&data->pUnknown));
data->pUnknown->lpVtbl->QueryInterface(data->pUnknown, &IID_IConnectionPointContainer, (void**)&data->pConnectionPointContainer));
data->pConnectionPointContainer->lpVtbl->FindConnectionPoint(data->pConnectionPointContainer, &DIID__IApplicationEvents, &data->pConnectionPoint));
data->pConnectionPoint->lpVtbl->Advise(data->pConnectionPoint, (IUnknown*)sink, &sink->dwCookie));

我已经实现了 QueryInterface、AddRef 和 Release。 如果 COM 对象将执行 QueryInterface 我 printf riid。

IID: 0x3 - 0x0 - 0x0 - 0x764D3E14
This-Objekt: 0030EC4C, ppvObject: 0030E2D4

IID: 0x3 - 0x0 - 0x0 - 0x764D3E14
This-Objekt: 0030EC4C, ppvObject: 0030E294

...

如何找出属于 IID 的接口?


编辑:

我很想将 IID 与我使用建议的 IsEqualGUID 知道的东西进行比较 但我不知道我的目标应用程序调用了哪些接口。

if(IsEqualGUID(iid, &IID_IThisIsWhatIAmLookingFor))

我试图找出我得到的数字属于哪个接口,所以我试图根据我得到的数字找到接口IID_IThisIsWhatIAmLookingFor。实施这是我的下一步。

【问题讨论】:

  • 查阅目标应用程序的文档。无论如何,您都需要该文档来了解如何实现该接口。

标签: c com


【解决方案1】:

如何找出属于 IID 的接口?

你无法从你持有的接口指针中分辨出IID。在代码中,您通常管理特定于某些接口的变量中的指针,并使用相应的IIDs 获取那里的值。

但是,您可以使用感兴趣的IID 拨打另一个QueryInterface 电话。请注意,您不能假设每次都获得相同的指针,除非IIDIID_IUnknown

【讨论】:

    【解决方案2】:

    如果你幸运的话,接口是自动化兼容的,并且存在 Typelib。在这种情况下,注册表包含一个条目HKEY_CLASSES_ROOT\Interface\{00000000-0000-0000-0000-000000000000}\TypeLib,指向HRCR\Typelib 下面的一个条目,它引用了一个您可以导入的.tlb 文件。

    另一种方法是以各种典型形式将 IID 输入 Google:

    • 00000000-0000-0000-0000-000000000000
    • 00000000-0000-0000-0000-0000-00000000

    【讨论】:

    • 感谢这有点帮助 - 但我仍然试图找出我需要实现的接口。我编辑了问题。
    • 如何在 ANSI-C 中导入 .tlb 文件?
    • 转换为.idl,然后正常生成标题。
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2019-08-31
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多