Опять про DECLARE_CLASSFACTORY_SINGLETON
От: John Scherbatov  
Дата: 25.03.03 06:13
Оценка:
Господа, здравствуйте.
Я использую в своей программе DECLARE_CLASSFACTORY_SINGLETON.
Проблема в том, что в FinalRelease у меня происходит работа с СОМ,
а вызывается он тогда, когда ДЛЛ уже выгружается (специфика DECLARE_CLASSFACTORY_SINGLETON) и
клиент успевает вызвать CoUninitialize. Соответствено у меня все ломается..
Необходимо заставить singleton выгружаться при обнулении счетчика ссылок.
Я прочитал http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q201321.
Однако, при вставке этого кода в свой проект получил ошибку. Вот пример:



/********** Start of singleton code **********/ 
.....
...
..

            if (SUCCEEDED(hRes))
            {
               hRes = CoMarshalInterface(m_pStream, IID_IUnknown,
                      m_pObj, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLEWEAK);
......
...
..
 

#define DECLARE_CLASSFACTORY_MYSINGLETON(obj)   DECLARE_CLASSFACTORY_EX(CMyComClassFactorySingleton<obj>)
/********** End of singleton code **********/ 




/////////////////////////////////////////////////////////////////////////////
// CLogger
class ATL_NO_VTABLE CLogger : 
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CLogger, &CLSID_Logger>,
    public ISupportErrorInfo,
    public IDispatchImpl<ILogger, &IID_ILogger, &LIBID_LOGSERVERLib>
{
public:
    CLogger()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_LOGGER)

//DECLARE_CLASSFACTORY_SINGLETON(CLogger)
DECLARE_CLASSFACTORY_MYSINGLETON(CLogger)
DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CLogger)
    COM_INTERFACE_ENTRY(ILogger)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

    HRESULT    FinalConstruct ();
    void FinalRelease ();

// ISupportsErrorInfo
    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
};


Компилятор ругается на
hRes = CoMarshalInterface(m_pStream, IID_IUnknown,
m_pObj, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLEWEAK);

error C2594: 'argument' : ambiguous conversions from 'class CMyComObject<class CLogger> *' to 'struct IUnknown *'

Подскажите в чем дело? Что-то слабо верится, что код приведенный в МСДН ошибочный.
Мои исправления в этом коде приводят к зависанию программы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.