无法让简单的 COM 项目工作:在哪里以及如何实施?
Posted
技术标签:
【中文标题】无法让简单的 COM 项目工作:在哪里以及如何实施?【英文标题】:Can't get simple COM project to work: where and how to put implementation? 【发布时间】:2012-01-20 12:05:09 【问题描述】:我正在尝试遵循Simple COM Tutorial 的步骤,这对我来说看起来不错且合乎逻辑。我通常会回避使用向导,但一致认为这是执行 COM 的最佳方式。
总结
-
使用向导创建 ATL 项目
使用“添加类”对话框创建 ATL 简单对象(示例中为
SimpleChatServer
)
导航到ClassView,右键单击对象的界面,添加方法(示例中为CallMe
)
教程给出了一个方法体来使用
编译
然而,我的编译失败了,因为
error C2509: 'CallMe' : member function not declared in 'CSimpleChatServer'
向导有什么问题吗?我本来希望 VS 自动在 CSimpleChatServer 中声明 CallMe 方法,并提供一个方法存根供我添加实现,但它没有。
(与本教程的另一个区别是类浏览器不显示类 CSimpleChatServer,您会认为它会显示。这可能是因为我禁用了智能感知吗?希望是一个单独的问题)。
那么,我要做什么,在哪里以及如何定义和声明具有功能的实际 C++ 方法?
【问题讨论】:
【参考方案1】:ATL 向导通常会在标头中声明方法(使用 STDMETHOD(BLah)(...)
),提供存根实现(使用 STDMETHODIMP CFoo::Blah(...)
)并将声明添加到 IDL 文件中。
但是,我记得当您手动修改头文件时,它会感到困惑,并且只会将声明添加到 IDL 中,而不是添加到 .h
和 .cpp
文件中。如果我是你,我会从头再来一次(除非你有充分的理由不这样做,否则避免使用 COM)。
当您获得经验时,您将摆脱生成方法的向导(但是对于类,它可能太复杂了)。
【讨论】:
谢谢,这有助于了解方法存根应该在那里。所以向导坏了——我现在找到了解决办法。【参考方案2】:所以 - 它与智能感知有关。由于需要编译 boost::geometry as recommended in the boost docs,我通过重命名 feacp.dll
禁用了智能感知。这导致 COM 添加类对话框无法将存根方法添加到我的 .h
和 .cpp
文件。
将C:\Program Files\Microsoft Visual Studio 9.0\VC\vcpackages\feacp.dll
恢复原名似乎可以解决此问题。
【讨论】:
以上是关于无法让简单的 COM 项目工作:在哪里以及如何实施?的主要内容,如果未能解决你的问题,请参考以下文章