Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.31;
Скачать: CL | DM;

Вниз

Работа с TXMLDocument   Найти похожие ветки 

 
Katerina   (2003-07-17 16:12) [0]

Стоит задача сгенерировать XML документ из уже существующих кусков. Моя Функция возвращает узел IXMLNode c вложенными узлами. В главной функции создан XMLDocument, добавлены свои узлы.
В этом куске кода возникает access violation: В чем ошибка?

XMLTree := TXMLDocument.Create(nil);
XMLTree.Active := true;
node := XMLTree.AddChild("APPLICATION");

//функция возвращает IXMLNode
node := UIState.GetUIState(Source);

//конкретно в этой строчке приложение вылетает
XMLTree.DocumentElement.ChildNodes.Add (node);


 
yaJohn ©   (2003-07-17 16:19) [1]

Тонкий намек: нода в данном случае - Com обьект.
Попробуй передавать не через result, а через глобальную переменную.
А ежели шибко надо через result - можно поигратся AddRef, но чревато утечками памяти.


 
vuk ©   (2003-07-17 16:34) [2]

to Katerina:
Попытался смоделировать. Никаких AV. Поподробнее, что там у Вас функция возвращает.

to yaJohn:
Ваш тонкий намек абсолютно мимо. Во-первых нет никакой разницы, COM объект там или не COM (к тому же его там может и не быть). А во-вторых никаких проблем при передаче интерфейсов через Result нет в природе.


 
yaJohn ©   (2003-07-17 18:07) [3]

Я не большой знаток технологии COM, просто я уже сталкивался с подобной проблемой. И именно с MSXML.
В части случаев, присвоение переменным (result в.т.ч.) IXMLNode и иже с ним не приводит к ожидаемому эффекту. Т.е. либо не вызывается AddRef, либо лишний раз вызывается Releasе.
Если интересно, я могу найти тот проект.

2 Katerina
Я бы на вашем месте все же попробовал перед выходом из функции вызвать для эксперимента result.addref; и посмотреть, что получится (или не получится).


 
vuk ©   (2003-07-17 18:12) [4]

to yaJohn:
>И именно с MSXML.
Заметьте, тут нет ни слова об MSXML. Напомню, что TXMLDocument может работать не через MSXML (у меня, в основном, через OpenXML работает).


 
Юрий Федоров ©   (2003-07-17 19:03) [5]

XMLTree.DocumentElement не равен ли nil ?
его ведь тоже создать надо


 
Serginio   (2003-07-17 19:17) [6]

2 vuk © (17.07.03 16:34) Все зависит, чему мы присваиваем интерфейс Если к поинтеру то _addref обязателен, если к интерфейсу то Delphi делает это автоматически.
Яркий пример добавление интерфейса к Tlist. При добавлении _Addref при Удалении _Release;


 
Юрий Федоров ©   (2003-07-17 19:24) [7]

>>Serginio (17.07.03 19:17)
для этого TInterfaceList существует :-)


 
Serginio   (2003-07-17 19:32) [8]

Енто все понятно. Просто нужно знать чему присваивается интерфейс с учетом поведения Delphi. Именно ето я и хотел сказать. А напридумывать TInterfaceList , Array of IUnknow и все похожее в этом духе можно выше крыши.


 
vuk ©   (2003-07-17 19:52) [9]

to Юрий Федоров:
>XMLTree.DocumentElement не равен ли nil ?
после строки
node := XMLTree.AddChild("APPLICATION");
уже не nil.

to Serginio:
>Все зависит, чему мы присваиваем интерфейс
Это я в курсе. Это иногда даже специально делается для обхода подсчета ссылок. Но тут явно не в интерфейсах дело.


 
Юрий Федоров ©   (2003-07-17 19:53) [10]

>>vuk © (17.07.03 19:52)
проглядел :-(


 
Katerina   (2003-07-18 00:22) [11]

Спасибо за ответы, но кажется тут проблема в самом вопросе :)
Я попытаюсь описать чего я действительно хочу:
1. у меня есть 2 TXMLDocument, каждый из которых содержит свой кусок документа
2. мне надо создать на их основе 3-й TXMLDocument приблизительно такого вида:
<xml3>
<xml1>
</xml1>
<xml2>
</xml2>
</xml3>

Пробовала добавлять IXMLNode из одного документа в другой но устойчиво получала AV.Потом прочитала, что добавлять ноды из одного докумена в другой _вообще_ нельзя.
Так как мне быть... ?


 
yaJohn ©   (2003-07-18 12:43) [12]

Можно сделать процедуру рекурсивного копирования ноды между двумя документами.
Но ИМХО лучше поступить дешево и сердито:
procedure TForm1.Button1Click(Sender: TObject);
begin
DOMDocument1.loadXML ("<main1><node1/></main1>");
DOMDocument2.loadXML ("<main2><node2/></main2>");
DOMDocument3.loadXML (
"<main3>" +
DOMDocument1.documentElement{.firstChild}.xml +
DOMDocument2.documentElement{.firstChild}.xml +
"</main3>");
ShowMessage (DOMDocument3.documentElement.xml);
end;



Страницы: 1 вся ветка

Текущий архив: 2003.07.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
1-100824
McSimm2
2003-07-17 15:46
2003.07.31
DrawText


1-100751
TCrash
2003-07-16 12:31
2003.07.31
ASM и время


3-100591
Макс
2003-07-09 07:47
2003.07.31
Grid


14-100912
Marser
2003-06-29 23:13
2003.07.31
Долгоиграющие форумисты :-)


14-100982
Князь Мышкин
2003-07-15 11:46
2003.07.31
Какой смысл в женщинах?