Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с MSXML 
:(
    Опции темы
Windhunter
Дата 7.7.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.7.2006

Репутация: нет
Всего: нет



Программа работает с несколькими динамическиподгружаемыми dll-ми. В каждой dll работает своя нить. Каждая dll использует MSXML для сохранения параметров.
Работают они примерно так:

CComPtr<IXMLDOMDocument>    m_spXMLDOM;
HRESULT hr = m_spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
hr = m_spXMLDOM->load(CComVariant(m_cFileName.c_str()), &bSuccess);
CComPtr<IXMLDOMNode> spXMLNodeMainRoot;
hr = m_spXMLDOM->selectSingleNode(CComBSTR(m_cRootName.c_str()), &spXMLNodeMainRoot);
CComQIPtr<IXMLDOMElement> spXMLChildElement;
hr = m_spXMLNodeMainRoot->selectSingleNode(CComBSTR(element.c_str()), &spXMLNode);
hr = spXMLChildElement->setAttribute(CComBSTR(attribute.c_str()),CComVariant(value.c_str()));
CComVariant variant(_T(m_cFileName.c_str()));
m_cFileName.c_str(), m_cModuleName.c_str());
hr = m_spXMLDOM->save(variant);
m_spXMLNodeMainRoot.Release();
m_spXMLDOM.Release();

(Естественно, всё это оформленно в виде класса).

Проблема в том, что при закрытии, программа виснет при записи параметоров в dll по этой схеме. Виснет при вызове m_spXMLDOM->save(variant). Такое ощущение, что COM-библиотека, предоставляющая реализацию интерфейсов MSXML выгружается до того, как последняя dll запишет свои параметры. Вопрос в том, когда по идее должны выгружаться COM-библиотеки. Функцию ::CoUninitialize(); вообще не использую. 
PM MAIL   Вверх
chaos
Дата 11.10.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



обычно объект ком-сервера выгружается как только счетчик ссылок становится равным 0
в любой книге по ком можно найти что-то типо
Код

LONG ClassName::Release()
{
    ::InterlockedDecrement(&m_lCounter)
    if (0 == m_lCounter)
        delete this;

    return m_lCounter;
}


Это сообщение отредактировал(а) chaos - 11.10.2006, 12:45
PM WWW   Вверх
lemax
Дата 30.7.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 14.10.2007

Репутация: нет
Всего: 1



Попробуй найти лишний вызов CoUninitialize()
Поставь бреак поинтер на все CoInitialize CoUninitialize и поиграйся
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.