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

Вниз

Проблемы с XML   Найти похожие ветки 

 
A. N. Onim   (2002-09-10 11:25) [0]

Помнится, под MSVC работал с MSXML парсером и неоднократно сталкивался с Гамлетовским вопросом - освобождать или не освобождать полученный интерфейсный указатель дитя (Child) при просмотре XML узла? Ответ был, как ни странно, нет. Release был не нужен.
Перешёл на Delphi, к компоненте TXMLDocument.
Беру корневой узел:

...
public:
m_pDocument: TXMLDocument;
...
procedure Test()
var
Saved: IXMLNode;
begin
m_pDocument := TXMLDocument.Create(nil);
m_pDocument.DOMVendor := GetDOMVendor ("MSXML");
m_pDocument.LoadFromFile("pos.xml");
Saved := m_pDocument.Node.ChildNodes[0];

// так просто тестик, что работает!
Form1.Caption := Saved.NodeName;

При выходе! БА - БАХ ! Access Violation
end;

Как я понимаю, был вызван Release на локальной копии интерфейса Saved при разрушении. Ладно. Добавлю в код _Addref() для Saved - не помогает. Двойной _Addref() выправляет ситуацию, но... Всё падает при уничтожении документа :( По ходу парсеринга такое г..о лезет аж жуть. Типа, у узла есть дети (HasChilds = true), а сами дети NodeChilds - Access Violation? Скажите, что это за гемор такой???


 
A. N. Onim   (2002-09-10 12:36) [1]

Создавать документ надо было обязательно с нениловским Parent"ом Вопрос исчерпан. Чёртов Delphi!


 
Ihor Osov'yak ©   (2002-09-10 13:02) [2]

Еще когда-то очень давно говорось, и не единыжды, не работайте одновременно по обьектным и интерфейсным ссылкам. Геморою не оберетесь. Это так, философия.

А теперь по существу. Интерфейсы в делфи относятся к "автоуничтожаемым" обьектам (тут термин обьект мной употреблен для для обозначения инстанции какого то класса, а для обозначения некой програмной субстанции).
Механизм "автоуничтожения" по отношению к интерфейсам работает так:
компилятор неявно вызывает _release всякий раз, когда интерфейсная ссылка уходит из области видимости или когда ей присваеватся новое значение (_release вызывается для старой ссылки). _Addref вызывается неявно при операции присваивания ...

Мораль здесь такова - не надо в делфи _release и _Addref явно вызывать. А если возникнет такое желание - хорошенько подумать, почитать книжки, попить водички и пт и снова подумать. И так до тех пор, пока это желание не пропадет.

Далее. Естественно, рано или позно будет вызван _release, который приведет к уничножению обьекта. А если мы еще имеем обьектную ссылку - как в вашем случае - то обьект уничтожается, ссылка на него смотрит, мы по ней чего то делаем - со всеми последствиями. Надеюсь, теперь понятно, почему я говорил, что очень неприветствуется одновременная работа по обьктным и по интервейсным ссылкам. Если все же очень нужно - то нужно предусмотреть "удерживающую" интерфейсную ссылку. Которую потом не забыть обнулить...




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

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

Наверх




Память: 0.47 MB
Время: 0.024 c
3-60933
maxim2
2002-08-28 10:05
2002.09.19
Не отображаются русские символы


3-60929
pdv
2002-08-27 19:45
2002.09.19
Я знаю, с этим вопросом вас уже запарили. Но всеже.


1-61186
RDA
2002-09-08 11:24
2002.09.19
Дочерние окна


3-60992
Бармалейка
2002-08-29 12:44
2002.09.19
подскажие как сделать запрос!


4-61374
Alibaba
2002-07-31 12:32
2002.09.19
FindWindowEx - не работает под Win2k! Что делать?