Здравствуйте, Vegost, Вы писали:
V>Так все же где освобождать ресурсы?
Обычно в FinalRelease().
Но есть подозрение что у Вас и он не вызовется, потому как в Вашем случае деструктор должен бы вызываться.
FinalRelease() — ведет себя так-же как и деструктор, т.е никак не вызывается.
Хотя в контроле (функция DllMain) часть связанная с DLL_PROCESS_DETACH
запускается
Здравствуйте, Vegost, Вы писали:
V>И внутри функции _Module.Term() вызывается Release() для каждого _ATL_OBJMAP_ENTRY т.е. и для класса CAlemar тоже
В _Module.Term() вызываются Release() для всех фабрик классов, а не экземпляров, полученных с помощью этих фабрик.
Единственный класс, который может получить Release() и деструктор, — это ATL синглетон, т.е. в котором есть упоминание DECLARE_CLASSFACTORY_SINGLETON.
Здравствуйте, Vegost, Вы писали:
V>FinalRelease() — ведет себя так-же как и деструктор, т.е никак не вызывается. V>Хотя в контроле (функция DllMain) часть связанная с DLL_PROCESS_DETACH V>запускается V>И внутри функции _Module.Term() вызывается Release() для каждого _ATL_OBJMAP_ENTRY V>т.е. и для класса CAlemar тоже
Это к делу отношения не имеет.
Похоже, у Вас просто где-то утечка ссылок.
Здравствуйте, ssm, Вы писали:
ssm>Здравствуйте, Vegost, Вы писали:
V>>Проект создавался как ATL Project. V>>Для класса компонента, wizard создал примерно такой код:
ssm>Нужен клиентский код использования COM объекта, у тебя ИМХО там проблемы
COM-понента вызывается из Internet Explorera
примерно так:
У меня аналогичная проблема. Мой плагин (сгенеренный wizrad'ом) к VS.NET нормально работает, вызывается он, соответсвенно, IDE'шкой и я ничего не меняю. Так вот объект создается, но не удаляется.
V>Проект создавался как ATL Project. V>Для класса компонента, wizard создал примерно такой код:
V>
V>/////////////////////////////////////////////////////////////////////////////
V>// CAlemar
V>class ATL_NO_VTABLE CAlemar :
V> public CComObjectRootEx<CComSingleThreadModel>,
V> public IDispatchImpl<IAlemar, &IID_IAlemar, &LIBID_ALMRCTRLLib>,
V> public CComControl<CAlemar>,
V> public IPersistStreamInitImpl<CAlemar>,
V> public IOleControlImpl<CAlemar>,
V> public IOleObjectImpl<CAlemar>,
V> public IOleInPlaceActiveObjectImpl<CAlemar>,
V> public IViewObjectExImpl<CAlemar>,
V> public IOleInPlaceObjectWindowlessImpl<CAlemar>,
V> public CComCoClass<CAlemar, &CLSID_Alemar>,
V> public IObjectSafetyImpl<CAlemar, INTERFACESAFE_FOR_UNTRUSTED_CALLER
V> | INTERFACESAFE_FOR_UNTRUSTED_DATA>
V>{
V>public:
V> CAlemar()
V> {
V> }
V>
V>Так вот, по завершению работы деструктор не вызывается V>Так же пытался вставить что-нибудь типа:
V>
V>virtual ULONG STDMETHODCALLTYPE Release()
V>{
V> //Освобождение ресурсов
V> // например
V> m_Pgp.FreeLib();
V>}
V>
V>ругается что метод Release уже определен V>Так все же где освобождать ресурсы?
V>Ну и соответственно по завершению работы с Explorer'ом вдруг почистить за собой (т.е за PGP Lib)
перечитал пять раз, но так и непонял к чему относится "вдруг"
мне вот интерестно, на основании чего сделан вывод о том, что деструктор не вызывается?
и как уже сказали, код для освобождения ресурсов рекомендуется помещать в FinalRelease()
Здравствуйте, ssm, Вы писали:
ssm>Здравствуйте, Vegost, Вы писали:
V>>Ну и соответственно по завершению работы с Explorer'ом вдруг почистить за собой (т.е за PGP Lib)
ssm>перечитал пять раз, но так и непонял к чему относится "вдруг"
Sorry очепятка вышла.
Ну т.е раньше я освобождал ресурсы в нутри вызваемого метода
например в IE вызываю <SCRIPT language="javascript">myObj.GetPrivDoc("")</SCRIPT>
внутри этого метода (GetPrivDoc) работаю с библиотекой PGP
а в конце метода освобождаю ресурсы и все что PGP насоздавала.
А теперь (пресловутый "вдруг") захотелось в начале работы инициализировать PGP,
а по завершению работы с InternetExplorer'ом ее освобождать где-нибудь в деструкторе.
IMHO: так красивее
ssm>мне вот интерестно, на основании чего сделан вывод о том, что деструктор не вызывается?
на основании работы с дебагером. Меню->Debug->Processes->(IE c моей компнентой)
причем в контроле отлично проходит через DLL_PROCESS_DETACH и вызывает
_Module.Term(); который в свою очередm вызывает IUnknown->Release()
для OBJECT_ENTRY(CLSID_Alemar, CAlemar)
ssm>и как уже сказали, код для освобождения ресурсов рекомендуется помещать в FinalRelease()
Обьявлял и Release и FinalRelease причем все компилируется без ошибок, но не вызывает
Все действительно решилось добавлением макроса
DECLARE_CLASSFACTORY_SINGLETON
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:
DECLARE_CLASSFACTORY_SINGLETON(CAlemar)
CAlemar()
{
m_strTempPath[0]='\0';
}
~CAlemar()
{
//освобождение ресурсов
}
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Vegost, Вы писали:
Vi2>
V>>class ATL_NO_VTABLE CAlemar : ... public CComControl<CAlemar>, public IOleControlImpl<CAlemar>,
V>>...
V>>DECLARE_CLASSFACTORY_SINGLETON(CAlemar)
Vi2>
Vi2>Контрол и синглетон? Что-то ты мудришь на ровном месте.
Вот именно в таком виде все компилируруется без ошибок и главное вызвается деструктор
по завершению работы.
А контрол он или не контрол не могу сказать.