Visual c++ “为什么?”;添加IDL方法";在接口上,将方法添加到模块以及CoClass?

Visual c++ “为什么?”;添加IDL方法";在接口上,将方法添加到模块以及CoClass?,visual-c++,com,visual-studio-2019,atl,compiler-bug,Visual C++,Com,Visual Studio 2019,Atl,Compiler Bug,这个问题是关于使用VisualStudio2019使用ATL构建进程外COM服务器的。(我以前在Borland做过,但这是我第一次使用MSVC) 我使用ATL项目向导创建了一个名为MyObjectsProject的项目。这在文件MyObjectsProject.cpp中创建了模块class CMyObjectsProjectModule:public ATL::CatlexeModule 然后我通过“Add>ATL simple object”添加了一个简单对象MyObject,如中所述。这将创

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

我使用ATL项目向导创建了一个名为
MyObjectsProject
的项目。这在文件
MyObjectsProject.cpp
中创建了模块
class CMyObjectsProjectModule:public ATL::CatlexeModule

然后我通过“Add>ATL simple object”添加了一个简单对象
MyObject
,如中所述。这将创建文件
MyObject.cpp
MyObject.h
,其中包含接口
IMyObject
和CoClass
CMyObject
。到目前为止还不错

我在类视图中转到
IMyObject
,右键单击“Add>Method”并给出一些细节,然后它将方法声明添加到
MyObject.h
中的
CMyObject
,并将空定义添加到
MyObject.cpp
作为
CMyObject::Method\u name()
。到目前为止,一切都很好

但同时,它将方法声明和定义作为
cmyobjectsprrojectmodule
的类成员添加到
myobjectsprroject.cpp
。此外:

  • 从未调用过
    cmyobjectsprrojectmodule::method_name()
    版本——当我通过客户端使用COM服务器,并在
    MyObject
    的实例上调用
    IMyObject::method_name()
    时,它会按预期执行定义为
    CMyObject::method_name()
    的版本
  • 我可以从
    CMyObjectsProjectModule
    中删除方法声明和定义,并且没有错误
如果添加属性,也会发生同样的情况。此外,“完成操作…”运行大约需要45-50秒


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

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



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

该方法不应添加到模块中,添加该方法也不应花费45-50秒

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

例如,它出现在模块为
cmyobjectsprrojectmodule
CMyObject
中,但不出现在模块为
CMyProjectModule
CMyObject

出现问题时,
CMyObject>派生类型>
的类视图显示派生类型
CMyObject
cmyobjectsprrojectmodule

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


结论:这似乎是IDE中的一个bug(或者至少是有问题的设计);为了解决这个问题,您可以重命名模块,以某个唯一的子字符串开头,这样就不会有任何coclass与模块的初始子字符串重合


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

我没有在2019 16.9.2上重现(以前从未见过),当然,这不应该发生,不应该向模块添加任何内容。我只在MyObject.idl、MyObject.cpp、MyObject.hWas上获得了一个方法名称,该项目最初创建于VS 2019,哪个版本?ATL向导在VS 2017的某个时候被破坏,并经历了几轮修复,这些修复扩展到早期VS 2019版本。@dxiv是的,新项目(我启动了一个新项目进行复制)。VS Professional 2019版本16.9.2另一件稍有奇怪的事情;在类视图中,
IMyOjbect
显示三次。两次使用界面图标,一次使用线条和两点图标。使用“转到定义”:一个转到
.idl
文件,两个转到
MyObject_i.h
文件。我一直在做“添加>添加方法”对前者。填写对话框后,会弹出一个“完成操作…”对话框,应用该对话框大约需要50秒,否则机器将无法运行slow@dxiv现在编辑的问题——如果您采取现有的复制尝试,请在类视图中。右键单击CMyProjectModule并将其“重命名”为CMyObjectsProjectModule,则问题应出现(+1)您可能需要提交正式的错误报告,并将其命名为第二季;-)FWIW子字符串错误甚至在第一次匹配时都没有停止。如果您添加另一个简单对象
MyObj
并向其添加一个方法
alt_method()
,VC++将冻结好几分钟,然后一旦它恢复生命,新方法将显示在所有
CMyObj
CMyObject
(尽管不在IMyObject的IDL中)和
cmyobjectsprrojectmodule
中。