ATL/COM:MIDL 编译器不输出分配接口的 UUID

Posted

技术标签:

【中文标题】ATL/COM:MIDL 编译器不输出分配接口的 UUID【英文标题】:ATL/COM: MIDL compiler doesn't output UUID for dispinterface 【发布时间】:2013-06-22 13:55:10 【问题描述】:

在为从我的班级触发的事件实现连接点时,我在 IDL 中声明了 dispinterface,就像这样

[
  uuid(123-MY-GENERATED-GUID)
]
dispinterface _IMyChangeEvents 
properties:
methods:
  [id(1)] void ItemChanged([in] BSTR changeInformation);
;

根据包括“ATL Internals”一书在内的多个来源,这应该会产生一个DIID__IMyChangeEvents,然后我可以使用它从ATL::IConnectionPointImpl<ImplClass, IID> 派生我的类。但它既不存在,我也不能在 CONNECTION_POINT_ENTRY 宏中使用 __uuidof(_IMyChangeEvents),如文档中所述,因为它抱怨“没有 GUID 与此对象关联”。

实现这个的正确方法是什么?

【问题讨论】:

sn-p 的代码看起来不错,问题出在其他地方:IDL 未编译,您不包含 IDL 生成的 C++ 文件等。 我尝试删除生成的标头,并在我构建项目时重新生成。但它只包含前向声明,既不包含 MIDL_INTERFACE 也不包含 DECLSPEC_UUID。文件中的其他接口也可以找到,有关此接口缺少 GUID 的投诉是唯一剩下的错误。 因为上面的短代码sn-p看起来不错,你让我们猜测实际问题出在哪里。例如,您可能想在线查看示例,或者我的VbsEvents。您将看到_IFooEvents 然后在VbsEvents_i.c 上生成启用UUID 的DIID__IFooEvents,然后将其包含在C++ 代码中,特别是通过__uuidof(...) 我现在发现这个链接让我更加困惑:microsoft.public.vc.language.narkive.com/JqCwWfLp/… 虽然有点过时,但表明显示的行为是正确的,我错过了一些东西。但是如果你说这样一切都是正确的,我会在另一个项目中尝试一些向导生成的代码。 【参考方案1】:

这段代码 sn-p 在 library 块内部还是外部? library 之外的所有内容都进入生成的 .h 文件。在 library 中定义或引用的所有内容都会进入生成的 .tlb 文件。

典型的 .IDL 文件如下所示:

interface IMyMainInterface ...;
dispinterface MyEvents ...;

library 
  coclass MyCoClass 
    [default] IMyMainInterface;
    [default, source] MyEvents;
  

这样,为了方便客户,您将拥有 .h 和 .tlb 中的所有内容。

【讨论】:

有趣的是,我也成功地尝试了另一种方式:在 library 块中使用调度接口,并在外部发出事件的 coclass。感谢您对生成过程的解释,我想我现在更好地理解了。

以上是关于ATL/COM:MIDL 编译器不输出分配接口的 UUID的主要内容,如果未能解决你的问题,请参考以下文章

错误 MIDL2025:语法错误:需要一个接口

Windows C - 使用 MIDL 协议通过引用动态分配的 unsigned char 内存传递指针

midl.exe 6 和 midl.exe 7 的不同输出

创建实现特定接口的 ATL COM 对象

扩展 MIDL 接口和 COM 对象设计

如何在 ATL COM 模块中打印控制台输出?