visual-c++ - 为什么接口上的“添加 IDL 方法”将方法添加到模块以及 CoClass?
问题描述
这个问题是关于使用 Visual Studio 2019 使用 ATL 构建进程外 COM 服务器。(我以前在 Borland 做过,但这是我第一次使用 MSVC)。
我创建了一个名为MyObjectsProject
ATL Project 向导的项目。class CMyObjectsProjectModule : public ATL::CAtlExeModuleT<CMyObjectsProjectModule>
这在文件中创建了模块MyObjectsProject.cpp
。
然后我按照文档中的MyObject
描述通过“添加 > ATL 简单对象”添加了一个简单对象。这创建了文件并包含一个接口和 CoClass 。到目前为止,一切都很好。MyObject.cpp
MyObject.h
IMyObject
CMyObject
我进入IMyObject
类视图,右键单击“添加>方法”并为其提供一些详细信息,然后将方法声明添加到CMyObject
inMyObject.h
并将空定义添加到MyObject.cpp
as CMyObject::method_name()
。到目前为止,很好(再次)。
但是同时,它添加了方法声明和定义MyObjectsProject.cpp
作为CMyObjectsProjectModule
. 此外:
- 该
CMyObjectsProjectModule::method_name()
版本永远不会被调用——当我通过客户端使用 COM 服务器并调用IMyObject::method_name()
的实例时,它会按预期MyObject
执行定义的版本。CMyObject::method_name()
- 我可以从中删除方法声明和定义,
CMyObjectsProjectModule
并且没有错误。
如果添加一个属性,也会发生同样的事情。此外,“完成操作...”运行大约需要 45-50 秒。
我的问题是:将方法添加到 Module 和 CoClass 背后的原因是什么,什么时候调用 Method 的那个版本?(或者这只是一个错误,根本不应该添加到模块中?)
在 Borland IDE 中,类似的函数不会向模块添加方法。
编辑:最初发布了名为 的项目MyProject
的问题,但是只有在调用项目时才会出现问题MyObjectsProject
。我最初在问题中使用了与我观察到的问题不同的名称,但现在已经编辑了问题并使用问题中的确切名称进行了复制。
解决方案
该方法不应该被添加到模块中,并且不应该花费 45-50 秒来添加该方法。
每当 CoClass 名称是模块名称的初始子字符串时,似乎就会出现问题。
例如,它发生在CMyObject
模块CMyObjectsProjectModule
上,但不发生CMyObject
在模块上CMyProjectModule
。
当问题发生时,类视图CMyObject > Derived Types >
显示派生类型CMyObject
和CMyObjectsProjectModule
.
我想这是在“推导出”两种类型之间的派生类型关系,其中一种是另一种的初始子字符串;此外,“添加方法”的行为决定将该方法添加到它认为是添加了该方法的 CoClass 的派生类型的所有内容中。
结论:这似乎是 IDE 中的一个错误(或至少是有问题的设计);为了解决这个问题,您可以将模块重命名为以一些唯一的子字符串开头,这样所有 CoClass 都不会与模块的初始子字符串重合。
类设计器工具没有将这两种类型显示为派生的(即,该工具似乎没有使用与类视图窗口相同的启发式方法来确定一种类型是否从另一种派生)
推荐阅读
- c# - 如何使用一个发布请求将两个对象添加到数据库?
- java - Projectreactor:并行执行查询并连接结果
- python-3.x - 如何为 tensorflow/pytorch 加载大型多文件 parquet 文件
- javascript - 在 JavaScript 中读取文本文件并转换为 JSON
- salesforce - 如何将来自不同内容槽*的产品放在一个轮播中
- python - 运行附加列表的 if 循环时获取“无”
- plot - 如何在 Julia 中针对另一个离散变量绘制离散变量?
- java - 流畅地链接多个方法,类似于 Stream 没有 Optional 类型的冗长
- mysql - 如果 Python3 MySQL 中的一个单元格为 NULL,则 TIMESTAMPDIFF 不起作用
- sql - 创建一个显示标题的视图