![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.