本问题涉及使用VisualStudio2019使用ATL构建进程外COM服务器.(我以前在Borland做过,但这是我第一次使用MSVC)。
我用ATL向导创建了一个名为MyObjectsProject的项目。这在MyObjectsProject.cpp文件中创建了模块MyObjectsProject.cpp。
然后,我通过文献资料中描述的"Add > ATL“添加了一个简单对象文献资料。这创建了包含接口MyObject.cpp和CoClass CMyObject的文件IMyObject和CoClass。到目前一切尚好。
我转到类视图中的IMyObject,右键单击"Add > Method“并给出一些细节,然后将方法声明添加到MyObject.h中的CMyObject中,并将空定义添加到MyObject.cpp作为CMyObject::method_name()。到目前为止,还不错(再次)。
同时,它将方法声明和定义作为MyObjectsProject.cpp的类成员添加到CMyObjectsProjectModule中。此外:
CMyObjectsProjectModule::method_name()版本永远不会被调用--当我通过客户端使用COM服务器,并在MyObject的实例上调用IMyObject::method_name()时,它将按预期执行定义为CMyObject::method_name()的版本。CMyObjectsProjectModule中删除方法声明和定义,并且没有错误。如果添加属性,也会发生同样的情况。还有,“完成手术”大约要花45到50秒的时间。
我的问题是:,为什么要将方法添加到模块以及CoClass中,什么时候会调用该方法的版本?(或者这只是一个bug,根本不应该添加到模块中?)
在Borland中,类似的函数不会向模块添加方法。
编辑:最初在项目中发布了一个名为MyProject的问题,但是只有当项目被称为MyObjectsProject时才会出现问题。我在问题中使用了与我观察到的问题不同的名称,但现在我已经编辑了这个问题,并使用问题中的确切名称进行了复制。
发布于 2021-03-31 02:52:48
该方法不应该添加到模块中,也不应该花45到50秒来添加该方法。
当CoClass名称是模块名称的初始子字符串时,问题似乎就会发生。
例如,对于CMyObject和模块CMyObjectsProjectModule都会出现这种情况,但是对于CMyObject和CMyProjectModule模块则不会发生这种情况。
当出现问题时,CMyObject > Derived Types >的类视图显示派生类型CMyObject和CMyObjectsProjectModule。
我猜这是在“推导”两种类型之间的派生类型关系,其中一种是另一种类型的初始子字符串;而且,"Add方法“的行为决定将该方法添加到它认为是添加了该方法的CoClass的派生类型中。
结论:在中,这似乎是一个bug (或者至少是有问题的设计);为了解决这个问题,您可以重命名模块,以一些独特的子字符串开始,这样没有一个CoClasses将与模块的初始子字符串一致。
类设计器工具没有显示派生的两种类型(即,该工具似乎没有使用与类视图窗口相同的启发式来判断一种类型是否来自另一种类型)
https://stackoverflow.com/questions/66864593
复制相似问题