привет, all!
есть класс с такими членами:
MSXML2::IXSLProcessorPtr m_spIXSLProcessor;
MSXML2::IXSLTemplatePtr m_spIXSLTemplate;
MSXML2::IXMLDOMDocument2Ptr m_spStyleSheet;
в одном из методов они работают:
if ( m_spIXSLTemplate == NULL ) {
hr = m_spIXSLTemplate.CreateInstance(__uuidof(MSXML2::XSLTemplate30));
if ( FAILED(hr) )
throw _com_error(hr);
m_spIXSLTemplate.AddRef();
}
if ( m_spStyleSheet == NULL) {
hr = m_spStyleSheet.CreateInstance(__uuidof(MSXML2::FreeThreadedDOMDocument30));
if ( FAILED(hr) )
throw _com_error(hr);
m_spStyleSheet.AddRef();
}
m_spStyleSheet->async = VARIANT_FALSE;
bSuccess = m_spStyleSheet->load(translatorFile);
m_spIXSLTemplate->PutRefstylesheet(m_spStyleSheet);
m_spIXSLProcessor = m_spIXSLTemplate->createProcessor();
m_spIXSLProcessor.AddRef();
а в десктрукторе класса валятся Access violation при удалении описанных выше членов
без AddRef тож не работает
памагите!!!!!
Здравствуйте ml, Вы писали:
ml>привет, all!
ml>есть класс с такими членами:
ml>ml> MSXML2::IXSLProcessorPtr m_spIXSLProcessor;
ml> MSXML2::IXSLTemplatePtr m_spIXSLTemplate;
ml> MSXML2::IXMLDOMDocument2Ptr m_spStyleSheet;
ml>
ml>в одном из методов они работают:
ml>ml> if ( m_spIXSLTemplate == NULL ) {
ml> hr = m_spIXSLTemplate.CreateInstance(__uuidof(MSXML2::XSLTemplate30));
ml> if ( FAILED(hr) ) // это лишнее, так как данные смарт поинтеры кидают эксепшн без тебя
ml> throw _com_error(hr);
ml> m_spIXSLTemplate.AddRef(); //это тем более лишнее
ml> }
ml>
ml> if ( m_spStyleSheet == NULL) {
ml> hr = m_spStyleSheet.CreateInstance(__uuidof(MSXML2::FreeThreadedDOMDocument30));
ml> if ( FAILED(hr) ) //лишнее
ml> throw _com_error(hr);
ml> m_spStyleSheet.AddRef(); //лишнее
ml> }
ml> m_spStyleSheet->async = VARIANT_FALSE;
ml> bSuccess = m_spStyleSheet->load(translatorFile);
ml> m_spIXSLTemplate->PutRefstylesheet(m_spStyleSheet);
ml>
ml> m_spIXSLProcessor = m_spIXSLTemplate->createProcessor();
ml> m_spIXSLProcessor.AddRef();//лишнее
ml>
ml>а в десктрукторе класса валятся Access violation при удалении описанных выше членов
ml>без AddRef тож не работает
ml>памагите!!!!!
Ты пользуешься смарт поинтерами и явно вызывать AddRef тебе не надо, а если валится даже с AddRef значит проблемма не в этом. Может по подробнее опишешь на удалении какого класса валиться, а лучше тот код на котором валиться
Здравствуйте Tom, Вы писали:
Tom>Ты пользуешься смарт поинтерами и явно вызывать AddRef тебе не надо, а если валится даже с AddRef значит проблемма не в этом. Может по подробнее опишешь на удалении какого класса валиться, а лучше тот код на котором валиться
Обычно такое бывает, когда деструктор вызывается после CoUninitialize.
Здравствуйте Lexey, Вы писали:
[...]
L>Обычно такое бывает, когда деструктор вызывается после CoUninitialize.
Уточню: деструктор смарт-поинтера. Сделай либо, чтобы их деструкторы вызвались раньше, либо напиши перед CoUninitialize() :
m_spXXXXXXXXX.Release();
Заметь: там ".", а не "->"
Здравствуйте ml, Вы писали:
ml>привет, all!
ml>есть класс с такими членами:
ml>а в десктрукторе класса валятся Access violation при удалении описанных выше членов
ml>без AddRef тож не работает
ml>памагите!!!!!
На сколько я понял проблему: AddRef не надо вызывать и
не надо удалять эти переменные в деструкторе.
Здравствуйте Lexey, Вы писали:
L>Обычно такое бывает, когда деструктор вызывается после CoUninitialize.
большое спасибо