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

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

Сенсация! Код initialization может не выполнятся! [D7, Win2k, WinXP]


Страницы:   1 2 3 4 5 6

MikProg ©   (2006-07-11 21:37:00) 

Написана прога. С целью сериализации в секции initialization семи унитов регистрируется описанные в них классы через registerclass. Фенька в следующем: у меня программа работает, у клиента нет. Вставленные в секцию инициализации отладочные строки для записи в файл пишут лог в порядке инициализации модулей. В логе запуска на моей машине (XP и Win2k) отметился каждый из 7 модулей. В логе запуска того же экзешника у клиента (Win2k) отметились тольк 3 из 7 модулей !!! Это полный трындец! Я понимаю что могу грубо регистрировать классы где нибудь в одном месте, но это есть покушение на устои! Кто нибудь может объяснить?


ЮЮ   (2006-07-12 09:15:00) [101]

Если программа слетела, а в файле лога нет ожидаемой информации, имхо, вовсе не следует,что она туда не "писалась", она могла просто "потеряться" из-за аварийного закрытия файла протокола = незакрытитию текстового файла


sniknik   (2006-07-12 08:59:00) [102]

> Добавлено позже для отладки
и как это гарантирует от ошибки в ней?

с чего вообще решено, что не отрабатывает initialization? ведь если убрать  лог, то никаких доказательств этого нет, а раз это еще и добавлялось позднее для проверки то получается решение, что виновато, принято раньше. на чем основываясь? нам ничего не приведено.
надо сказать тут можно считать вовсе ничего не приведено, т.к. код оказывается проверкой домыслов (неизвестно на чем основанных. нам неизвестно. автор возможно судит по ошибке "не буду работать! © initialization" ;), то его можно откинуть, он ничего не показывает/не доказывает. плюс еще откидываем эмоции и остается - "у меня программа работает, у клиента нет" (единственный факт/значимая инфа), и для этого факта есть куча обьяснений попроще чем вера в чудо.
... тоже мне нашол "чудо", да такие "чудеса" куча народу считающих себя программистами пишут.


Сергей М.   (2006-07-12 08:41:00) [103]


> MikProg ©   (12.07.06 08:21) [9]


Судя по сравнению фрагментов приведенных логов, если у клиента в логе отсутствует строчка "IGGPaintBoxShape start" (и все последующие), то "чудо" живет именно в LogRecord().


MikProg   (2006-07-12 08:21:00) [104]

>который сам борланд использует.

А использован не он? В каких еще местах Борл размещает registerclass?

>возможно чудо "живет" в процедуре LogRecord

Добавлено позже для отладки


sniknik   (2006-07-11 23:12:00) [105]

возможно чудо "живет" в процедуре LogRecord (помню долго тут ктото такоеже чудо рекламировал (запись в несуществующий файл)... а в итоге оказалось пишет в текущую директорию, которая негарантирована, т.е. не всегда та, что надо)


Суслик   (2006-07-11 23:06:00) [106]


> А надо

Скажу, как думаю - а фиг его знает.
Не секрет, что специфицированность некоторых аспектов Object Pascal недосточна. Бывает, что intialization не выполняется для модулей из runtime пакетов. Хоть закономерность невыполнения указанной секции мне ясна, но  я этого в доке явно не видел. Поэтому надо (имхо, есно) полагаться на подход, который сам борланд использует.


MikProg   (2006-07-11 22:58:00) [107]

А надо? Там довольно длинная иерархия и в проект включены только модули с классами участвующими в сериализации (в которых имеется registerclass).


Суслик   (2006-07-11 22:46:00) [108]

Чисто формальный вопрос
А где LayerBase в списке модулей?

(просто не понимаю)


MikProg   (2006-07-11 22:44:00) [109]

скомпилировано все в одном


MikProg   (2006-07-11 22:19:00) [110]

unit RenderParameters;

initialization

 LogRecord('RenderParameters start');
 RegisterClasses([TSurfacePoint,TSurface,TBaseRenderParams,TRenderParams]);
 LogRecord('RenderParameters end');

finalization

end.

unit IGGProjectsCollection;

initialization

 LogRecord('IGGProjectsCollection start');
 RegisterClass(TFrameProjectMember);
 RegisterClass(TFrameProject);
 RegisterClass(TProjectsCollection);
 LogRecord('IGGProjectsCollection end');

finalization

end.

unit IGGPaintBoxImaged;

initialization

 LogRecord('IGGPaintBoxImaged start');
 RegisterClass(TFrameImaged);
 LogRecord('IGGPaintBoxImaged end');

finalization
 
end.

unit IGGPaintBoxImage;

initialization

 LogRecord('IGGPaintBoxImage start');
 RegisterClass(TFrameImage);
 TFrameImage.LayerClassesRegistrator(TFrameImage);
 LogRecord('IGGPaintBoxImage start');

finalization

end.

unit IGGPaintBoxShape;

initialization

 LogRecord('IGGPaintBoxShape start');
 RegisterClasses([TFramePoly,TFrameFigure,TFrameGeom,TFramePie]);

 TFramePoly.LayerClassesRegistrator(TFramePoly);
 TFrameFigure.LayerClassesRegistrator(TFrameFigure);
 TFrameGeom.LayerClassesRegistrator(TFrameGeom);
 TFramePie.LayerClassesRegistrator(TFramePie);
 LogRecord('IGGPaintBoxShape end');

finalization

end.

unit IGGPaintBoxText;

initialization

 LogRecord('IGGPaintBoxText start');
 RegisterClass(TFrameText);
 TFrameText.LayerClassesRegistrator(TFrameText);
 LogRecord('IGGPaintBoxText end');

finalization

end.

unit IGGPaintBoxDrowing;

initialization

 LogRecord('IGGPaintBoxDrowing start');
 RegisterClass(TFrameDrowing);
 TFrameDrowing.LayerClassesRegistrator(TFrameDrowing);
 LogRecord('IGGPaintBoxDrowing end');

finalization

end.

Все происходят от базового класса, который определяет  
LayerClassesRegistrator

unit LayerBase;

interface

uses
 windows, classes, unit3;

type

 TLayerBase = class;
 TLayerBaseClass = class of TLayerBase;

 TLayerItem = class (TCollectionItem)
 end;

 TLayerBase = class (TComponent)
 private
   FLayerID: cardinal;
 protected
   procedure AssignTo(Dest: TPersistent); override;
 public
   constructor Create(AOwner: TComponent); override;
   class function CreateFrom(Sample: TLayerBase): TLayerBase; virtual;
   class procedure LayerClassesRegistrator(LayerClass: TLayerBaseClass);
   class function LayerClassesCount: integer;
   class function LayerClassesItems(index: integer): TLayerBaseClass; overload;
   class function LayerClassesItems(ClassName: String): TLayerBaseClass; overload;
   property LayerID: cardinal read FLayerID;
 end;

implementation

var
 LayerClasses: array of TLayerBaseClass;
 LayerIDs: cardinal;

class procedure TLayerBase.LayerClassesRegistrator(
 LayerClass: TLayerBaseClass);
begin
 SetLength(LayerClasses,high(LayerClasses)+2);
 LayerClasses[high(LayerClasses)]:=LayerClass;
end;

class function TLayerBase.LayerClassesCount: integer;
begin
 Result:=high(LayerClasses)+1;
end;

initialization

 LayerClasses:=nil;
 LayerIDs:=0;

finalization

end.

в Dpr все выглядит вот так

uses
 Classes,
 Forms,
 Unit1 in 'Ani\Unit1.pas' {Form1},
 IGG2AniEdit in 'Ani\IGG2AniEdit.pas' {IGG2AniEditFrame: TFrame},
 IGGPaintBoxText in 'Modules\IGGPaintBoxText.pas',
 IGGPaintBoxDrowing in 'Modules\IGGPaintBoxDrowing.pas',
 IGGPaintBoxImage in 'Modules\IGGPaintBoxImage.pas',
 IGGPaintBoxImaged in 'Modules\IGGPaintBoxImaged.pas',
 IGGPaintBoxShape in 'Modules\IGGPaintBoxShape.pas',
 GIFImage in 'Utils\GIFImage.pas',
 RenderParameters in 'Modules\RenderParameters.pas',
 IGGPaintBoxControls in 'Modules\IGGPaintBoxControls.pas',
 IGGProjectsCollection in 'Modules\IGGProjectsCollection.pas',
 Unit3 in 'Unit3.pas';

{$R *.res}

begin
 Application.Initialize;
 RegisterClass(TFrameText);
 RegisterClass(TFrameDrowing);
 RegisterClasses([TFramePoly,TFrameFigure,TFrameGeom,TFramePie]);
 RegisterClasses([TSurfacePoint,TSurface,TBaseRenderParams,TRenderParams]);
 Application.CreateForm(TForm1, Form1);
 CheckRegisteredClassList;
 Application.Run;
end.


registerclass сюда всунут позже, чтобы хоть как то работало.

У меня в логе
11.07.2006 16:27:00 : Initializing parameters
11.07.2006 16:27:00 : RenderParameters start
11.07.2006 16:27:00 : RenderParameters end
11.07.2006 16:27:00 : IGGProjectsCollection start
11.07.2006 16:27:00 : IGGProjectsCollection end
11.07.2006 16:27:00 : IGGPaintBoxImaged start
11.07.2006 16:27:00 : IGGPaintBoxImaged end
11.07.2006 16:27:00 : IGGPaintBoxImage start
11.07.2006 16:27:00 : IGGPaintBoxImage start
11.07.2006 16:27:00 : IGGPaintBoxControls start
11.07.2006 16:27:00 : IGGPaintBoxControls end
11.07.2006 16:27:00 : IGGPaintBoxShape start
11.07.2006 16:27:00 : IGGPaintBoxShape end
11.07.2006 16:27:00 : IGGPaintBoxText start
11.07.2006 16:27:00 : IGGPaintBoxText end
11.07.2006 16:27:00 : IGGPaintBoxDrowing start
11.07.2006 16:27:00 : IGGPaintBoxDrowing end

У клиента в логе (на американской винде 2000)
7/11/2006 4:50:08 PM : Initializing parameters
7/11/2006 4:50:08 PM : RenderParameters start
7/11/2006 4:50:08 PM : RenderParameters end
7/11/2006 4:50:08 PM : IGGProjectsCollection start
7/11/2006 4:50:08 PM : IGGProjectsCollection end
7/11/2006 4:50:08 PM : IGGPaintBoxImaged start
7/11/2006 4:50:08 PM : IGGPaintBoxImaged end
7/11/2006 4:50:08 PM : IGGPaintBoxImage start
7/11/2006 4:50:08 PM : IGGPaintBoxImage start
7/11/2006 4:50:08 PM : IGGPaintBoxControls start
7/11/2006 4:50:08 PM : IGGPaintBoxControls end


Суслик   (2006-07-11 22:13:00) [111]

runtime пакеты используешь?


Мефисто   (2006-07-11 21:40:00) [112]

Код в студию, и возможно объясним...


Страницы:   1 2 3 4 5 6

Наверх

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