最初に、私は COM の動作に非常に不慣れですが、他の誰かのために問題をデバッグする任務を負っています。
pvTaskCOM と pvFormsCOM という名前の 2 つの COM プロジェクトがあり、それぞれに多くのインターフェイスがありますが、私が関心を持っているのは次の 2 つです。
pvTaskCOM にある ITaskActPtr
pvFormsCOM にある IChartingObjectPtr
私の問題を引き起こしているコード行は次のとおりです。
ITaskActPtr pTaskAct = m_pChartObj;
m_pChartObj は IChartingObjectPtr です。私が遭遇した問題は、1 つのワークフローでこの割り当てを行った後、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 を返します。
私が持っている質問は、コードの同じ行に対して 2 つの異なる COM を見ている原因は何ですか? ある種の継承の問題ですか?正しい方向への一歩が必要です。