Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IXMLDocument убивается раньше времени 
V
    Опции темы
kami
Дата 18.10.2012, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Доброго времени суток, господа!
Вновь я с вопросом по непонятной мне области...
Имеем: D2010, Win7.
Код, работающий в дополнительном потоке (на всякий случай - синхронизация с другими потоками не требуется, очередь сообщений создана):

Код

function TAddressModule.GetNodeListFromXML(XMLStream: TStream): IXMLNodeList;
var
  xml: IXMLDocument;
  root: IXMLNode;
  resultNode: IXMLNode;
begin
  // CoInitializeEx(nil, COINIT_MULTITHREADED) вызывается в конструкторе.
  Result := nil;

  xml := TXMLDocument.Create(nil); // тут всё нормально, IXMLDocument создается
  xml.LoadFromStream(XMLStream, xetUTF_8);
  xml.Active := True;
  root := xml.Node.ChildNodes.FindNode('root');
  if Assigned(root) then
    begin
      resultNode := root.ChildNodes.FindNode('result');
      if Assigned(resultNode) then
        Result := resultNode.ChildNodes;
    end;
  // весь код отрабатывает "на ура", Result - валидный указатель.

end; // а вот тут вызывается xml.Release, сам xml высвобождается и всё рушится. Выявлено трассировкой FastMM

Соответственно, по выходу из функции Result указывает в никуда...
Как победить и возможно ли это? Не хотелось бы выносить этот код выше по уровню вложенности - ему много где предстоит использоваться...

P.S. С xml работать пришлось впервые, так что если есть ошибки/некорректности помимо основного вопроса - также буду признателен на указание оных.
PM MAIL WWW   Вверх
lomaster
Дата 18.10.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну а чего вы хотели от интерфейсной ссылки? больше ее никто не использует ее разрушили.
Клонировать надо в результат ваш лист.
Либо менять подход, к примеру переложить в список объектов, либо XMLDocument создавать раньше а сюда передать параметром, либо еще как, ... от задачи надо исходить.
PM   Вверх
bems
Дата 18.10.2012, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(lomaster @  18.10.2012,  17:01 Найти цитируемый пост)
Ну а чего вы хотели от интерфейсной ссылки? больше ее никто не использует ее разрушили.

не знаю что хочет ТС, а я хотел бы чтобы объект, реализующий IXMLNodeList хранил ссылку на докумет. Хотя с другой стороны наверное привело бы к циклической ссылке


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 18.10.2012, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(lomaster @  18.10.2012,  17:01 Найти цитируемый пост)
больше ее никто не использует ее разрушили.

Как это - никто не использует? Мне очень нужна ее "дочка" - IXMLNodeList.
И мне крайне непонятно, почему при наличии ссылки на нужный мне интерфейс убивается его родитель, убивая тем самым и нужную мне информацию.
Цитата(bems @  18.10.2012,  17:54 Найти цитируемый пост)
а я хотел бы чтобы объект, реализующий IXMLNodeList хранил ссылку на докумет.

Имхо, было бы неплохо.

Победить это, я так понял, нереально? Значит, придется пересматривать эту часть кода... Эх, где наша не пропадала...
PM MAIL WWW   Вверх
MetalFan
Дата 18.10.2012, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



На то они и интерфейсы. Мало-ли какая там дочка кому нужна. Ссылок на сам интерфейс ноль - интерфейс уничтожился.
И это очень удобно и логично на мой взгляд. А если учитывать, что кто-то где-то на дцатого чилда ссылается, так представляю, как весь этот механизм тормозить начнет.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lomaster
Дата 18.10.2012, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Как это - никто не использует?
 У вас в коде это написано.
Цитата

Мне очень нужна ее "дочка" - IXMLNodeList.
 Мало ли кто чего хочет, вы лучше объясните как должен счетчик на IXMLDocument узнать и инкрементится, через астрал?
Руками делайте, только вот как вы потом декремент делать будете я даже и предположить не могу. smile

Добавлено через 9 минут и 15 секунд
Цитата

так что если есть ошибки/некорректности помимо основного вопроса 
 Ну не то чтобы ошибки, а просто на будущее, "поднимите" xpath.
PM   Вверх
Чучмек
Дата 18.10.2012, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Код

xml._AddRef;



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
kami
Дата 18.10.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну ладно, ладно, пристыдили  smile 
Код будет переделан с учетом этой особенности.

Добавлено через 4 минуты и 52 секунды
Вот только одного в толк не возьму - до того, как перенес этот код в рабочее приложение, тестировал его в однопоточном VCL (простейший вывод результата в мемо). И никаких проблем не было...


Чучмек, этого, если честно, хотелось избежать. Ибо в приведенной здесь реализации некому будет делать xml.Release... Или я неправильно понял?
PM MAIL WWW   Вверх
Чучмек
Дата 18.10.2012, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(kami @  18.10.2012,  22:35 Найти цитируемый пост)
Ибо в приведенной здесь реализации некому будет делать xml.Release

Да некому. Я сейчас попробовал получить через IXMLNodeList "родителя" - IXMLDocument. Но увы :(


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 18.10.2012, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



У IXMLNodeList "родителя" не нашел, а вот у IXMLNode есть OwnerDocument - вот это он и есть родимый.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




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


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

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