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