描述:
我实现的一个COM对象(COM EXE),我希望无论多少个CLIENT连接,都只创建一个实例,每个客户都获得同一个实例的接口,因为这个COM对象是一个仪器控制测量的COM,如果创建多个实例,涉及到资源的问题。
class ATL_NO_VTABLE CControl :
public CComObjectRoot,//CComObjectRootEx<CComMultiThreadModel>,//CComSingleThreadModel>,
public CComCoClass<CControl, &CLSID_Control>,
public IConnectionPointContainerImpl<CControl>,
public IDispatchImpl<IControl, &IID_IControl, &LIBID_POWERCOMPLib>,
public IDispatchImpl<IConfigure, &IID_IConfigure, &LIBID_POWERCOMPLib>,//手动添加
public IDataStatus, //手动添加
public ISupportErrorInfo,//手动添加
public CProxy_IControlEvents< CControl >//,
{
...
private:
CDevice1 *dev1;//这是我的设备类,在FinalConstruct中创建,它将使用计算机端口资源,所以不能创建多份实例。
}
初学COM,不知我的想法正不正确?
解决方案1:
我记得有一个getactiveobject(),不知道能不能干活。你可以在cocreateinstance之前getactiveobject()一下,看有没有该组件的实例存在,没有再创建,有就直接拿过来用了。
解决方案2: 使用CComSingleThreadModel作为CComObjectRootEx的模板参数是说,组件实例创建在进程的主STA中,对这个组件的创建和调用都会交由进程中的主STA完成,组件实例只有一个,所有客户的访问会是队列式的,且所有数据成员(包括全局和静态成员)不需要同步
当然如果有并发性要求,也可以使用CComMultiThreadModel作为CComObjectRootEx的模板参数,组件实例创建在进程的主MTA中,因为MTA在进程中是唯一的,所以组件实例也只有一个,所有客户的访问会是并发的,所有数据成员需要同步
另外,楼主做的是进程外组件(exe),还要保证服务器进程的唯一性,所以在类场代码中对CoRegisterClassObject调用时,倒数第二参数有要求(具体是什么忘了),以保证服务器进程只创建一个。
累,不对的请高手详细指正。
楼上说的不对,感觉要改写atl的生成的IClassFactory的实现,得到存在的接口指针。
至于如何得到,期待高手出现
添加DECLARE_CLASSFACTORY_SINGLETON(CEtermApps)
class ATL_NO_VTABLE CEtermApps :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CEtermApps, &CLSID_EtermApps>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CEtermApps>,
public IDispatchImpl<IEtermApps, &IID_IEtermApps, &LIBID_ETERMINTERFACELib>
{
public:
CEtermApps()
{
i=0;
}
DECLARE_CLASSFACTORY_SINGLETON(CEtermApps)
DECLARE_REGISTRY_RESOURCEID(IDR_ETERMAPPS)
DECLARE_PROTECT_FINAL_CONSTRUCT()