C++ ATL/COM:MIDL编译器不';disp接口的t输出UUID
在为类中激发的事件实现连接点时,我在IDL中声明了一个C++ ATL/COM:MIDL编译器不';disp接口的t输出UUID,c++,visual-c++,visual-studio-2012,com,atl,C++,Visual C++,Visual Studio 2012,Com,Atl,在为类中激发的事件实现连接点时,我在IDL中声明了一个dispinterface,如下所示 [ uuid(123-MY-GENERATED-GUID) ] dispinterface _IMyChangeEvents { properties: methods: [id(1)] void ItemChanged([in] BSTR changeInformation); }; 根据包括《ATL Internals》一书在内的多个来源,这应该会生成一个DIID\uu IMyChangeE
dispinterface
,如下所示
[
uuid(123-MY-GENERATED-GUID)
]
dispinterface _IMyChangeEvents {
properties:
methods:
[id(1)] void ItemChanged([in] BSTR changeInformation);
};
根据包括《ATL Internals》一书在内的多个来源,这应该会生成一个DIID\uu IMyChangeEvents
,然后我可以使用它从ATL::IConnectionPointImpl
派生类。但它既不存在,也不能在连接点\u条目中使用\uuidof(\u imychangevents)
,如文档中所述,因为它抱怨“没有与此对象关联的GUID”
实现这个的正确方法是什么?这个代码段是在库{}块的内部还是外部?库{}之外的所有内容都进入生成的.h文件。在库{}中定义或引用的所有内容都将进入生成的.tlb文件
典型的.IDL文件如下所示:
interface IMyMainInterface {...};
dispinterface MyEvents {...};
library {
coclass MyCoClass {
[default] IMyMainInterface;
[default, source] MyEvents;
}
}
这样,你就可以拥有所有在.h和in .tb中的所有东西,为你的客户提供方便。
代码片段看起来不错,问题在别处:IDL没有编译,你不包括从IDL生成的C++文件等。我试着删除生成的头,并且在我构建这个项目时它被重新生成。但它只包含一个转发声明,既不包含MIDL_接口也不包含DECLSPEC_UUID。此外,文件中的其他接口也很好,关于此接口缺少GUID的投诉是唯一剩下的错误。因为上面的短代码片段看起来不错,您让我们猜测实际问题在哪里。您可能希望在线查看示例,例如我的示例。然后,你会看到UuID启用的代码“代码> diIDyIfioOcjvices <代码>,它被C++代码所包含,特别是通过<代码>·uuIDOF(…)>代码>。我现在发现这个链接让我更加困惑:尽管有点过时,但它显示了所显示的行为是正确的,我丢失了一些东西。但是,如果你说一切都是这样正确的,我将在另一个项目中尝试一些向导生成的代码。有趣的是,我也成功地尝试了另一种方法:让库{}
块中的dispinterface和一个在外部发出事件的coclass。感谢您对生成过程的解释,我想我现在更了解它了。