подсчёт ссылок
От: ml  
Дата: 23.09.02 11:24
Оценка:
привет, 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 тож не работает
памагите!!!!!
Re: подсчёт ссылок
От: Tom Россия http://www.RSDN.ru
Дата: 23.09.02 11:34
Оценка:
Здравствуйте 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 значит проблемма не в этом. Может по подробнее опишешь на удалении какого класса валиться, а лучше тот код на котором валиться
Народная мудрось
всем все никому ничего(с).
Re[2]: подсчёт ссылок
От: Lexey Россия  
Дата: 23.09.02 20:05
Оценка:
Здравствуйте Tom, Вы писали:


Tom>Ты пользуешься смарт поинтерами и явно вызывать AddRef тебе не надо, а если валится даже с AddRef значит проблемма не в этом. Может по подробнее опишешь на удалении какого класса валиться, а лучше тот код на котором валиться


Обычно такое бывает, когда деструктор вызывается после CoUninitialize.
"Будь достоин победы" (c) 8th Wizard's rule.
Re[3]: подсчёт ссылок
От: RS Земля ICQ: 148844272
Дата: 24.09.02 15:27
Оценка:
Здравствуйте Lexey, Вы писали:

[...]
L>Обычно такое бывает, когда деструктор вызывается после CoUninitialize.

Уточню: деструктор смарт-поинтера. Сделай либо, чтобы их деструкторы вызвались раньше, либо напиши перед CoUninitialize() :
m_spXXXXXXXXX.Release();

Заметь: там ".", а не "->"
Re: подсчёт ссылок
От: Nikto Россия  
Дата: 25.09.02 03:11
Оценка:
Здравствуйте ml, Вы писали:

ml>привет, all!

ml>есть класс с такими членами:

ml>а в десктрукторе класса валятся Access violation при удалении описанных выше членов

ml>без AddRef тож не работает
ml>памагите!!!!!

На сколько я понял проблему: AddRef не надо вызывать и не надо удалять эти переменные в деструкторе.
Re[3]: подсчёт ссылок
От: ml  
Дата: 25.09.02 09:02
Оценка:
Здравствуйте Lexey, Вы писали:


L>Обычно такое бывает, когда деструктор вызывается после CoUninitialize.

большое спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.