背景
我正在使用的应用程序有几个 COM DLL。
其中一个 COM DLL 有一个全局单例对象,它存储指向其他 DLL 中 COM 接口的指针。因为它是一个全局单例对象,所以我使用了惰性初始化习惯用法,因为我试图获取指针的接口可能存在于尚未加载的 DLL 中。
(旁注:这在注册单个 DLL 时尤其重要,因为全局对象将在regsvr32
进程中构建,我不希望 DLL 在此过程中尝试获取到另一个 DLL 的接口。)
例如,我的惰性初始化方法会做这样的事情:
CComPtr<IMyOtherObject>&
CGlobalSingleton::
GetMyOtherObject()
{
// SNIP: Other code removed for clarity...
if (! m_pMyOtherObject)
{
hr = pUnknown->QueryInterface(IID_IMyOtherObject,
(void**) &m_pMyOtherObject);
}
return m_pMyOtherObject;
}
注意: m_pMyOtherObject
是CComPtr
类型的成员变量。
延迟初始化可能与我的问题无关,但为了完整起见,我将其包括在内。
问题
我注意到的是,在某些情况下,当我的应用程序关闭时,我会收到失败的断言。但是,如果我将代码更改为QueryInterface()
每次需要访问时调用IID_IMyOtherOBject
(而不是将其存储为成员变量),这会阻止断言。
在我看来,这似乎是一个 COM 对象生命周期问题。我的假设是,因为我是storing
一个 COM 指针,所以在我指向的 COM 接口的破坏和我自己指向它的指针之间需要某种同步。
我对这个CComPtr
类(我正在使用)的理解是,它消除了处理生命周期问题(即调用AddRef()
and Release()
)的很多麻烦。但它似乎不适用于我的情况。
谁能选择我可能做错了什么?