首先让我说我对 COM 的工作非常缺乏经验,但我的任务是为其他人调试问题
我有两个名为 pvTaskCOM 和 pvFormsCOM 的 COM 项目,每个项目都有很多接口,但我关心的两个是:
pvTaskCOM 中的 ITaskActPtr
pvFormsCOM 中的 IChartingObjectPtr
导致我的问题的代码行是:
ITaskActPtr pTaskAct = m_pChartObj;
其中 m_pChartObj 是 IChartingObjectPtr。我遇到的问题是 pTaskAct 在一个工作流程中分配后为 NULL,但在大多数其他工作流程中都很好。我使用调试器深入研究了这里发生的事情,发现它在 QueryInterface 期间查看了错误的 COM 条目。在工作正常的工作流中,QueryInterface 从 pvTaskCOM/pvTaskAct.h 中获取条目:
BEGIN_COM_MAP(CTaskAct)
COM_INTERFACE_ENTRY(ITaskAct)
.
.
.
END_COM_MAP()
其中包含我要转换到的接口,QueryInterface 返回 S_OK。
但在这个其他工作流程中,m_pChartObj 以相同的方式实例化,但 QueryInterface 出于某种奇怪的原因在 pvFormsCOM/ChartingObject.h
BEGIN_COM_MAP(CChartingObject)
COM_INTERFACE_ENTRY(IChartingObject)
.
.
.
END_COM_MAP()
它不包含我们尝试转换到的 ITaskAct,因此 QueryInterface 返回 E_NOINTERFACE。
我的问题是什么可能导致它在同一行代码中查看两个不同的 COM?这是某种继承问题吗?我只需要朝着正确的方向迈出一步。