我正在使用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;
答案 0 :(得分:2)
是从运行实例获取类对象的正确方法还是应该使用其他任何方法?
不,不是。 CoCreateInstanceEx
深入研究COM工厂技工的深度,以获得所需对象的工厂并创建一个新工具。
获得"副本"在您上次使用的同一个实例中,有一些选项可供选择;
AddRef()
,以增加您要创建的对象指针副本的COM对象引用计数。然后使用该指针直到不再需要它,然后调用Release()
。 Release()
递减引用计数,如果它是最后一个引用,COM对象可以自行销毁。这不会执行对象及其内容的深层复制。DECLARE_CLASSFACTORY_SINGLETON
。Clone()
方法,这里的确切机制将取决于对象本身,但通常它只是通常处理相应的数据字段。坦率地说,除非这是学习COM如何运作的练习,否则不要使用裸指针并尝试手动管理对象生命周期。使用ATL类,特别是ATL::CComPtr<>
,它会按照您的预期处理这些问题。
您没有详细说明创建对象的方式和位置。有更高级的对象注册和检索技术,可以更好地控制对象的创建,生命周期和使用。如果它们合适,你可以探索它们;
GetActiveObject
et al。