Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

out- параметр интерфейс


Scott Storch ©   (2010-11-26 11:37:00) 

Столкнулся с очередной проблемой. В методе pack_get_hdr класса Thdr_analyzer в качестве out-параметра используется интерфейс IXMLDOMDocument. При попытке вызова какого-либо его метода внутри метода pack_get_hdr вылетает AccessViolation (Интерфейс заранее инициализирую, при передаче его уже в методе pack_get_hdr он почему-то = nil). В чем проблема? Ниже пример:


unit Unit14;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ZIPForge, msxml;

type
 TTestForm = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declaration }
 public
   { Public declaration }
 end;

 Thdr_analyzer = class(TObject)
 var
   {  }
   FHdr: IXMLDOMDocument;
   {  }
   procedure pack_get_hdr(APack: TZIPForge; out Apack_hdr: IXMLDOMDocument);
 public
   constructor Create(const Afile_name: string);
   destructor Destroy; override;
 end;

var
 TestForm: TTestForm;

implementation

{$R *.dfm}

{ Thdr_analyzer }

constructor Thdr_analyzer.Create(const Afile_name: string);
var
 Pack: TZIPForge;
begin
 Pack := TZIPForge.Create(nil);
 try
   Pack.FileName := Afile_name;
   try
     Pack.OpenArchive;
   except
     raise Exception.Create(Format('Пакет обновления "%s" поврежден или имеет неизвестный формат.',
       [Afile_name]));
   end;
   Fhdr := CoDOMDocument.Create;
   pack_get_hdr(Pack, FHdr);

 finally
   Pack.Free;
 end;

end;

destructor Thdr_analyzer.Destroy;
begin
 FHdr := nil;
 inherited;

end;

procedure Thdr_analyzer.pack_get_hdr(APack: TZIPForge;
 out Apack_hdr: IXMLDOMDocument);
var
 S: string;
begin
 try
   APack.ExtractToString('hdr.xml', S);
 except
   raise Exception.Create('Не удалось извлечь заголовок пакета обновления.');
 end;

 // -> AccessViolation
 Assert(Apack_hdr.loadXML(S), 'Не удалось загрузить заголовок пакета обовления.')

end;

{ TTestForm }

procedure TTestForm.FormCreate(Sender: TObject);
var
 ha: Thdr_analyzer;
begin
 ha := Thdr_analyzer.Create('D:\Хлам\Updates\upd_659_to_661.zip');
 try
 finally
   ha.Free;
 end;

end;

end.


Scott Storch   (2010-11-26 12:18:00) [1]

Все ясно. Спасибо


Anatoly Podgoretsky   (2010-11-26 12:14:00) [2]

Вот перевод переводчиком

> Параметр out, как параметра переменной, передается по
> ссылка. С параметром out, однако начальное значение
> ссылочной переменной отбрасывается от обычной она
> передается. Выходной параметр для вывода только;
> Это, он указывает функции или процедуры, где для хранения продукции,
> но не предоставляет какие-либо материалы.


Anatoly Podgoretsky   (2010-11-26 12:14:00) [3]

> han_malign  (26.11.2010 12:01:04)  [4]

Уложился в два слова.


han_malign   (2010-11-26 12:01:00) [4]


> в двух словах на русском

- в ыходнойпараметр


RWolf   (2010-11-26 11:46:00) [5]

translate.google.com же.


Scott Storch   (2010-11-26 11:45:00) [6]

можно в двух словах на русском, что это значит, сижу с телефона нет возможности воспользоваться переводчиком.


Anatoly Podgoretsky   (2010-11-26 11:42:00) [7]

Справка!

> An out parameter, like a variable parameter, is passed by
> reference. With an out parameter, however, the initial value
> of the referenced variable is discarded by the routine it
> is passed to. The out parameter is for output only; that
> is, it tells the function or procedure where to store output,
>  but doesn't provide any input.


Наверх

Титульная страница Поиск, карта сайта Написать письмо