无法让简单的 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 项目工作:在哪里以及如何实施?的主要内容,如果未能解决你的问题,请参考以下文章

《麦肯锡方法》第13章 与客户合作-思维导图

《麦肯锡方法》第13章 与客户合作-思维导图

ManageEgine:如何有效地实施ITSM流程?

如何给客户做产品培训

Facebook for swift 4.2 实施错误

OKR如何与项目管理相结合