Не вызывается деструктор.
От: Vegost Россия  
Дата: 30.03.05 05:23
Оценка:
Проект создавался как ATL Project.
Для класса компонента, wizard создал примерно такой код:

#ifndef __ALEMAR_H_
#define __ALEMAR_H_

#include "resource.h"       // main symbols
#include <atlctl.h>
#include <exdisp.h>
#include <Mshtml.h>

#include "pgpfunc.h"

/////////////////////////////////////////////////////////////////////////////
// CAlemar
class ATL_NO_VTABLE CAlemar : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IAlemar, &IID_IAlemar, &LIBID_ALMRCTRLLib>,
    public CComControl<CAlemar>,
    public IPersistStreamInitImpl<CAlemar>,
    public IOleControlImpl<CAlemar>,
    public IOleObjectImpl<CAlemar>,
    public IOleInPlaceActiveObjectImpl<CAlemar>,
    public IViewObjectExImpl<CAlemar>,
    public IOleInPlaceObjectWindowlessImpl<CAlemar>,
    public CComCoClass<CAlemar, &CLSID_Alemar>,
    public IObjectSafetyImpl<CAlemar, INTERFACESAFE_FOR_UNTRUSTED_CALLER 
                          | INTERFACESAFE_FOR_UNTRUSTED_DATA>

{
public:
    CAlemar()
    {
    }


DECLARE_REGISTRY_RESOURCEID(IDR_ALEMAR)

DECLARE_PROTECT_FINAL_CONSTRUCT()


BEGIN_COM_MAP(CAlemar)
    COM_INTERFACE_ENTRY(IAlemar)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IViewObjectEx)
    COM_INTERFACE_ENTRY(IViewObject2)
    COM_INTERFACE_ENTRY(IViewObject)
    COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceObject)
    COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
    COM_INTERFACE_ENTRY(IOleControl)
    COM_INTERFACE_ENTRY(IOleObject)
    COM_INTERFACE_ENTRY(IPersistStreamInit)
    COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
    COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()


BEGIN_MSG_MAP(CAlemar)
    CHAIN_MSG_MAP(CComControl<CAlemar>)
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// IViewObjectEx
    DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// IAlemar
public:
     ~CAlemar()
    {
        //Вот сдесь должны освобождать какие-нибудь ресурсы
            // например
            m_Pgp.FreeLib();

    }
    STDMETHOD(GetDoc)(/*[in]*/BSTR bstrAddr);
    STDMETHOD(Decrypt)(/*[out, retval]*/ BSTR *pVal);
    STDMETHOD(Initialize)();
    STDMETHOD(PostFile)(BSTR FileName, BSTR Request, BYTE iSource);
    STDMETHOD(get_lReadyState)(LONG* pVal);
    STDMETHOD(put_lReadyState)(LONG newVal);

    HRESULT OnDraw(ATL_DRAWINFO& di)
    {
//
        return S_OK;
    }

    char m_strTempPath[_MAX_PATH];
    PGPClass m_Pgp;
};

#endif //__ALEMAR_H_



Так вот, по завершению работы деструктор не вызывается
Так же пытался вставить что-нибудь типа:


virtual ULONG STDMETHODCALLTYPE Release()
{
  //Освобождение ресурсов
  // например
  m_Pgp.FreeLib();
}


ругается что метод Release уже определен
Так все же где освобождать ресурсы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.