实现了IClassFactory的COM Exe程序,他通过CreateInstance来创建实例,好像系统会保证一个单实例
但是在某些特殊情况下,实际测试比如采用run as administrator,还是会出现多个实例
所以想问一下有没有什么好方法,或者说正宗的方法,可以实现单实例效果通过CreateEvent和GetLastError() == ERROR_ALREADY_EXISTS配合实现的方法我已经知道了
到底行不行我还没试因为对COM不了解,想问一下,COM下正宗的处理方法是什么?
谢谢!

解决方案 »

  1.   

    我记得《COM内幕技术》第5章节 引用计数   讲过COM内部的AddRef和Release的内部实现是用
    InterLockedIncrement和InterLockedDecrement来实现的。如果你要单例的话,就在CreateInstance里面查询m_cref这个全局(本来是由上面两个函数控制的)
      

  2.   

    如果LZ使用 atl ,那就在COM类中使用  DECLARE_CLASSFACTORY_SINGLETON (CXX)
    如果LZ使用MFC,参考以下代码
    //////////
    class CMyOleObjectFactory : public COleObjectFactory
    {
    public:
    CMyOleObjectFactory( REFCLSID clsid, CRuntimeClass* pRuntimeClass, 
    BOOL bMultiInstance, LPCTSTR lpszProgID ) :
    COleObjectFactory(clsid,pRuntimeClass,bMultiInstance,lpszProgID)
    {}; // singleton version of CreateInstance
    CCmdTarget *OnCreateObject()
    {
    // return static singleton object
    static CMySrv obj;
    return &obj;
    }
    };//////////
      

  3.   

    用DECLARE_CLASSFACTORY_SINGLETON宏,它帮你实现了