从进程外COM服务器返回接口指针的正确方式是什么
What is the correct way to return interface pointer from out-of-process COM server?
我有一个进程外COM服务器,它有两个ATL COM对象。object1公开了一个接口,该接口在内部创建object2,并以以下方式返回一个指向它的接口指针:
HRESULT CObject1::CreateObject2(IObject2** pIobj2)
{
CComObject<Object2>* pObj = NULL;
HRESULT hr = CComObject<Object2>::CreateInstance(&pObj);
hr = pObj->QueryInterface(IID_IObject2,(void**)pIobj2);
//Some reason i need to store this pIobj2
(*pIobj2)->AddRef();
return hr;
}
Object1公开另一个接口以删除object2
HRESULT CObject1::RemoveObject2(IObject2* pIobj2)
{
pIobj2->Release(); //This to compensate QI done in CreateObject2
pIobj2->Release(); //This to compensate addref done to store in create
}
我的要求是,客户端不应在IObject1::CreateObject2()
之后的任何位置对IObject2
指针调用Release。要销毁object2,它应该调用IObject1::RemoveObject2()
。当我执行客户端时,在RemoveObject2之后,object2不会被销毁,但当我在RemoveObject2中对客户端中的Iobject2指针调用release时,object2会被销毁。
进程外COM对象中的生命周期管理比进程中复杂得多。例如,系统必须考虑到另一方可能会死亡(例如,如果客户端进程在没有发布的情况下死亡,服务器应该清理为对象分配的资源(。为此,Microsoft有一个DCOM垃圾收集。
实际上有两个COM对象,分别位于客户端(代理(和服务器(存根(上。代理维护自己的引用计数,而您的代码混淆了这个引用计数,因为您在服务器上发布了对象2的引用计数——这些信息不会到达客户端。
我强烈鼓励你改变你的架构。首先,COM约定是使用release方法来释放对象。这就是合同,而您的设计更改了它,这就是您对DCOM感到困惑的原因。
我认为更好的设计是:
- 在Object2中保留对Object1的引用(例如m_pobj1(
- 没有Object1::RemoveObject2。如果您需要做一些工作,请使用专用(非COM(CleanupObject2
- 实现Object2::FinalRelease(Object2的清理方法(,并调用m_pobj1->cleanup[Object2(this(
- 请记住,如果您需要在obj1中保留指向obj2的指针,请确保这些指针是弱引用。这只是指针,而不添加引用计数
客户端调用Object1::CreateObject2并获取对obj2的引用。完成后,它们将调用obj2->Release((,并清除引用计数,并调用obj1->CleanupObject2方法。
相关文章:
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在reactor中存储eventHandlers的最佳方式是什么
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 在C++中,建议通过数组循环的方式是什么?
- DLL共享数据的推荐方式是什么
- 等待线程的最佳方式是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 只显示片段着色器的最佳方式是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 在 c++ 中打印到控制台的最佳方式是什么?
- 在Qt Creator中应用代码更改的快捷方式是什么?
- 在C 中超负荷构造函数的合适方式是什么
- 执行随机开关函数的QT方式是什么连续两次使用相同情况的方法
- 在某些代码中覆盖方法的方式是什么?
- 为单个函数同时声明多个变量的最佳方式是什么
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- 在c++中存储一个对象或不存储对象的首选方式是什么
- 在C 项目中包含库的不同方式是什么?
- 解释"Bit String"的最佳方式是什么
- 计算差异数据并通过网络发送的最佳方式是什么