Re[3]: Непонятки с CAtlServiceModuleT.Не вызывается FinalCo
От: mamont Россия  
Дата: 24.10.05 05:28
Оценка:
Здравствуйте, Vi2,

Я разобрался в чём дело. В отличие от ATL 3.0, ATL 7.1 не создаёт "реальных объектов ... Кроме синглетонов". Тут Vita прав. Однако, я ожидал поведения, как в ATL 3.0.


При внимательном просмотре кода внутренностей ATL я обнаружил, что одно из отличий в реализации singleton'а заключается как раз в создании глобального объекта в ATL 3.0. Вот, что есть в ATL 7.1:


/////////////////////////////////////////////////////////////////////////////////////////////
// Singleton Class Factory
template <class T>
class CComClassFactorySingleton : public CComClassFactory
{
public:
    CComClassFactorySingleton() : m_hrCreate(S_OK)
    {
    }
    virtual ~CComClassFactorySingleton()
    {
    }
    // IClassFactory
    STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj)

...

    HRESULT m_hrCreate;
    CComPtr<IUnknown> m_spObj;
};


А вот, что было в ATL 3.0:


/////////////////////////////////////////////////////////////////////////////////////////////
// Singleton Class Factory
template <class T>
class CComClassFactorySingleton : public CComClassFactory
{
public:
    void FinalRelease()
    {
        CoDisconnectObject(m_Obj.GetUnknown(), 0);
    }

    // IClassFactory
    STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj)

...

    CComObjectGlobal<T> m_Obj;
};


Т.е. в ATL 7.1. глобальный объект надо создавать ручками дополнительно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.