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

Вниз

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

 
Stenfit   (2010-08-06 15:21) [0]

В консольном приложении вызывается процедура проверки содержимого xml-фала находящегося в zip-файле. Для доступа использую компоненты ZIPForge + delphi"йский XML парсер.


procedure chk_pack(file_name: string);
 var
   All, I: Integer;
   src_pack, xml_src: TStream;
   xml_obj: TXMLDocument;
   zip_obj: TZIPForge;
 begin
   src_pack := TFileStream.Create(file_name, fmOpenRead or fmShareDenyNone);
   try
     zip_obj := TZIPForge.Create(nil);
     try
       zip_obj.OpenArchive(src_pack, False);
       try
         xml_src := TMemoryStream.Create;
         try
           zip_obj.ExtractToStream("info.xml", xml_src);
           xml_src.Position := 0;
           xml_obj := TXMLDocument.Create(nil);
           try
             xml_obj.LoadFromStream(xml_src);
             with xml_obj.DocumentElement do // <- ОШИБКА
               if SameText(NodeName, "update") then
               begin
                 { ... }
               end
               else { ... } ;
           finally
             xml_obj.Free;
           end;
         finally
           xml_src.Free;
         end;
       finally
         zip_obj.CloseArchive;
       end;
     finally
       zip_obj.Free;
     end;
   finally
     src_pack.Free;
   end;
 end;


Вручную создаю и удаляю объект TXMLDocument с AOwner = nil. В этом и проблема. При обращении к свойству DocumentElement вызывается вылетает AccessViolation. Если же AOwner = Self - все OK отрабатывает. В чем проблема?


 
Юрий Зотов ©   (2010-08-06 15:30) [1]

When TXMLDocument is created without an Owner , it behaves like an interfaced object. That is, when all references to its interface are released, the TXMLDocument instance is automatically freed. When TXMLDocument is created with an Owner , however, it behaves like any other component, and is freed by its Owner .


 
Stenfit   (2010-08-06 15:36) [2]

И что теперь делать? Функция будет вызываться единожды и не зависеть от других функции консольного приложения.  Как передать Owner?

Вот так будет работать..., но это маразм брать одну функцию в класс.


TMyClass = class(TComponent)
   public
     function IsOKPack(const file_name: string): Boolean;
   end;


 
Юрий Зотов ©   (2010-08-06 15:51) [3]

Достаточно изменить объявление переменной:
xml_obj: IXMLDocument;
и убрать вызов
xml_obj.Free


 
Stenfit   (2010-08-06 15:53) [4]

спасибо. тему можно закрывать.


 
Медвежонок Пятачок ©   (2010-08-06 16:30) [5]

достаточно никогда не вызывать фри если создал с оунером=нил



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

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

Наверх




Память: 0.47 MB
Время: 0.009 c
2-1281369967
DROWSY
2010-08-09 20:06
2010.10.31
TIBCustomDataSet .RecordCount


6-1228160302
uw
2008-12-01 22:38
2010.10.31
Подключение через VMware Network Adapter


15-1280014034
Иксик
2010-07-25 03:27
2010.10.31
Контекстная реклама или совпадение???


15-1279788012
Медвежонок Пятачок
2010-07-22 12:40
2010.10.31
хочется волшебства


2-1281093695
Stenfit
2010-08-06 15:21
2010.10.31
TXMLDocument