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的主要内容,如果未能解决你的问题,请参考以下文章