COM - CoCreateInstanceEx始终创建一个新对象

时间:2016-02-11 06:58:02

标签: c++ com

我正在使用COM CoCreateInstanceEx API在本地计算机上创建特定类的实例。

我再次使用相同的函数来获取之前创建的实例,但它创建了一个新实例。

是从运行实例获取类对象的正确方法还是应该使用其他任何方法?

C ++代码段:

HRESULT nResult = CLSIDFromProgID(OLESTR("ABC"), &clsid);
MULTI_QI mqi[1];
mqi[0].pIID = &IID_IUnknown;
mqi[0].pItf = NULL;
mqi[0].hr = 0;

nResult = CoCreateInstanceEx(clsid, NULL, CLSCTX_LOCAL_SERVER, NULL, 1, mqi); 

IUnknown *pUnk = mqi[0].pItf;

1 个答案:

答案 0 :(得分:2)

  

是从运行实例获取类对象的正确方法还是应该使用其他任何方法?

不,不是。 CoCreateInstanceEx深入研究COM工厂技工的深度,以获得所需对象的工厂并创建一个新工具。

获得"副本"在您上次使用的同一个实例中,有一些选项可供选择;

  • 在第一个创建的对象上调用AddRef(),以增加您要创建的对象指针副本的COM对象引用计数。然后使用该指针直到不再需要它,然后调用Release()Release()递减引用计数,如果它是最后一个引用,COM对象可以自行销毁。这不会执行对象及其内容的深层复制。
  • 如果您有权访问代码,则可以将COM对象设置为单例,或者根据需要修改生命周期。如果COM对象代码使用ATL,那么这里有几个可以提供帮助的宏,特别是DECLARE_CLASSFACTORY_SINGLETON
  • 在执行深层复制的COM对象上创建一个Clone()方法,这里的确切机制将取决于对象本身,但通常它只是通常处理相应的数据字段。

坦率地说,除非这是学习COM如何运作的练习,否则不要使用裸指针并尝试手动管理对象生命周期。使用ATL类,特别是ATL::CComPtr<>,它会按照您的预期处理这些问题。

您没有详细说明创建对象的方式和位置。有更高级的对象注册和检索技术,可以更好地控制对象的创建,生命周期和使用。如果它们合适,你可以探索它们;

  1. GetActiveObject et al。
  2. 的主动对象机制
  3. 如果正在使用的对象使用ROT(运行对象表)注册自己,您还可以explore the using the ROT