Господа, здравствуйте.
Я использую в своей программе 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 *'
Подскажите в чем дело? Что-то слабо верится, что код приведенный в МСДН ошибочный.
Мои исправления в этом коде приводят к зависанию программы.