首页 > 解决方案 > 为什么接口上的“添加 IDL 方法”将方法添加到模块以及 CoClass?

问题描述

这个问题是关于使用 Visual Studio 2019 使用 ATL 构建进程外 COM 服务器。(我以前在 Borland 做过,但这是我第一次使用 MSVC)。

我创建了一个名为MyObjectsProjectATL Project 向导的项目。class CMyObjectsProjectModule : public ATL::CAtlExeModuleT<CMyObjectsProjectModule>这在文件中创建了模块MyObjectsProject.cpp

然后我按照文档中的MyObject描述通过“添加 > ATL 简单对象”添加了一个简单对象。这创建了文件并包含一个接口和 CoClass 。到目前为止,一切都很好。MyObject.cppMyObject.hIMyObjectCMyObject

我进入IMyObject类视图,右键单击“添加>方法”并为其提供一些详细信息,然后将方法声明添加到CMyObjectinMyObject.h并将空定义添加到MyObject.cppas CMyObject::method_name()。到目前为止,很好(再次)。

但是同时,它添加了方法声明和定义MyObjectsProject.cpp作为CMyObjectsProjectModule. 此外:

如果添加一个属性,也会发生同样的事情。此外,“完成操作...”运行大约需要 45-50 秒。


我的问题是:将方法添加到 Module 和 CoClass 背后的原因是什么,什么时候调用 Method 的那个版本?(或者这只是一个错误,根本不应该添加到模块中?)

在 Borland IDE 中,类似的函数不会向模块添加方法。


编辑:最初发布了名为 的项目MyProject的问题,但是只有在调用项目时才会出现问题MyObjectsProject。我最初在问题中使用了与我观察到的问题不同的名称,但现在已经编辑了问题并使用问题中的确切名称进行了复制。

标签: visual-c++comvisual-studio-2019atlcompiler-bug

解决方案


该方法不应该被添加到模块中,并且不应该花费 45-50 秒来添加该方法。

每当 CoClass 名称是模块名称的初始子字符串时,似乎就会出现问题。

例如,它发生在CMyObject模块CMyObjectsProjectModule上,但不发生CMyObject在模块上CMyProjectModule

当问题发生时,类视图CMyObject > Derived Types >显示派生类型CMyObjectCMyObjectsProjectModule.

我想这是在“推导出”两种类型之间的派生类型关系,其中一种是另一种的初始子字符串;此外,“添加方法”的行为决定将该方法添加到它认为是添加了该方法的 CoClass 的派生类型的所有内容中。


结论:这似乎是 IDE 中的一个错误(或至少是有问题的设计);为了解决这个问题,您可以将模块重命名为以一些唯一的子字符串开头,这样所有 CoClass 都不会与模块的初始子字符串重合。

设计器工具没有将这两种类型显示为派生的(即,该工具似乎没有使用与类视图窗口相同的启发式方法来确定一种类型是否从另一种派生)


推荐阅读