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

Вниз

Сенсация! Код initialization может не выполнятся!   Найти похожие ветки 

 
MikProg ©   (2006-07-12 14:09) [40]


> И что же там "криминального" творится, по-твоему ?

Ничего. Просто никто не удосужился посмотреть код, а рассуждений...


 
Суслик ©   (2006-07-12 14:13) [41]

автору
ты бы все-таки указал в списке юнитов проекта (он, насколько я понял, у тебя один - никаких пакетов) все юниты, которые ты в том числе неявно используешь.
Насколько я понял такие юниты у тебя есть.


 
Суслик ©   (2006-07-12 14:13) [42]

автору
ты бы все-таки указал в списке юнитов проекта (он, насколько я понял, у тебя один - никаких пакетов) все юниты, которые ты в том числе неявно используешь.
Насколько я понял такие юниты у тебя есть.


 
Суслик ©   (2006-07-12 14:13) [43]

автору
ты бы все-таки указал в списке юнитов проекта (он, насколько я понял, у тебя один - никаких пакетов) все юниты, которые ты в том числе неявно используешь.
Насколько я понял такие юниты у тебя есть.


 
StriderMan ©   (2006-07-12 14:15) [44]

рекомендую обернуть код в INITIALIZATION в try..finally и в finally писать в лог. так достовернее будет.


 
MikProg ©   (2006-07-12 14:20) [45]


> Насколько я понял такие юниты у тебя есть.

Придется, наверное, но не хочется (как не хочу и регистрировать классы где нибудь кроме initialization) - все они кандидаты на сборку в две-три библиотеки содержащие классы разных уровней иерархии.


 
MikProg ©   (2006-07-12 14:23) [46]


> рекомендую обернуть код в INITIALIZATION в try..finally
> и в finally писать в лог. так достовернее будет.

Достоверней чем что? Типа глобальный ExceptionHandler рантайма еще не готов?


 
StriderMan ©   (2006-07-12 14:25) [47]


> StriderMan ©   (12.07.06 14:15) [44]
> рекомендую обернуть код в INITIALIZATION в try..finally
> и в finally писать в лог. так достовернее будет.

а еще лучше так

try
   ...
except
 //пишем ошибку
end;
 //  пишем что все ОК


 
Сергей М. ©   (2006-07-12 14:36) [48]


> MikProg ©   (12.07.06 14:09) [40]



> никто не удосужился посмотреть


Поясни нам, валенкам, что мы должны были увидеть в этом коде такого, что хоть как-то намекало бы на суть твоей проблемы ..


 
sniknik ©   (2006-07-12 14:40) [49]

Игорь Шевченко ©   (12.07.06 13:53) [38]
> отсюда резонный вопрос - какая разница, указывать const или не указывать ?
для контроля "себя любимого". хотя честно не знал, что оптимизатор стал таким умным. всегда писал (и буду скорее всего ;).


 
StriderMan ©   (2006-07-12 14:42) [50]


> Aplication.OnException, в нем ту же LogRecord() с выводом
> текста ошибки


> Достоверней чем что? Типа глобальный ExceptionHandler рантайма
> еще не готов?

initialization в модулях выполняется еще до Application.Initialize, а именно на первом begin в проекте. Поэтому если там произойдет исключение, никакой Application.OnException ничего не поймает.

ЗЫ: Только что испытал


 
MikProg ©   (2006-07-12 14:44) [51]


> хоть как-то намекало бы на суть твоей проблемы ..

В ожидании полезных сведений я пока закомментировал RegisterClipboardFormat и жду вестей от клиента.


 
Сергей М. ©   (2006-07-12 14:46) [52]


> MikProg ©   (12.07.06 14:44) [51]


Комментируй хоть самого господа бога? но я рекомендую вникнуть в RTTI.


 
sniknik ©   (2006-07-12 14:50) [53]

> В ожидании ...
не хочеш пока развеять сомнения и ответить, что же у тебя в LogFileName? привести код его определения, и сказать где это происходить.


 
MikProg ©   (2006-07-12 14:51) [54]


> ЗЫ: Только что испытал
>

Напоминаю. Приложение не вызывает ошибок! А буде она произойдет вы об этом узнаете в любом случае или от обработчика в RTL дельфы или от винды (небезизвестный диалог "Приложение будет закрыто.")


 
MikProg ©   (2006-07-12 14:52) [55]


> что же у тебя в LogFileName?

Блин.
function LogFileName: string;
var
 s, s1: string;
begin
 s:=ParamStr(0);
 s1:=ExtractFileExt(s);
 Result:=copy(s,1,length(s)-length(s1))+".log";
end;


 
Сергей М. ©   (2006-07-12 14:54) [56]


> MikProg ©   (12.07.06 14:51) [54]


Ты с дуба упал ?)

С какого перепугу незарегистрированность некоего дельфийского класса вызовет "небезизвестный диалог "Приложение будет закрыто." ?)


 
MikProg ©   (2006-07-12 14:55) [57]


> вникнуть в RTTI.

Ну-ну. Подскажите как в монолитном экзешнике создать две копии RTTI.


 
MikProg ©   (2006-07-12 14:57) [58]


> С какого перепугу незарегистрированность

Почитай свои посты до полного понимания.


 
StriderMan ©   (2006-07-12 15:01) [59]


> Блин.
> function LogFileName: string;
> var
>  s, s1: string;
> begin
>  s:=ParamStr(0);
>  s1:=ExtractFileExt(s);
>  Result:=copy(s,1,length(s)-length(s1))+".log";
> end;


каждый раз при записи в лог такие строковые вычисления??? жуть...

ЗЫ: Result:= ParamStr(0) + ".log";


 
MikProg ©   (2006-07-12 15:04) [60]


> ЗЫ: Result:= ParamStr(0) + ".log";

вы оптимизирете отладочный код? В любом случае - спасибо, я попробую, но вряд ли это поможет. :)


 
StriderMan ©   (2006-07-12 15:05) [61]


> каждый раз при записи в лог такие строковые вычисления??
> ? жуть...

даже дважды....


> procedure LogRecord(s: string);
> var
>  f: Text;
>  oems: array [0..4096] of Char;
> begin
>    Assign(f,LogFileName);
>    if not FileExists(LogFileName) then
>      Rewrite(f)
>    else
>      Append(f);
>    Writeln(f,DateTimeToStr(now)," : ",s);
>    Close(f);
> end;


.. а Close надо бы в finally засунуть...


 
Сергей М. ©   (2006-07-12 15:15) [62]


> MikProg ©   (12.07.06 14:55) [57]
>
>
> > вникнуть в RTTI.
>
> Ну-ну. Подскажите как в монолитном экзешнике создать две
> копии RTTI.


Нунукай в другом месте.

Каждая RTTI создается при инициализации каждой RTL.


 
Игорь Шевченко ©   (2006-07-12 15:30) [63]

MikProg ©   (12.07.06 14:44) [51]

Тут такой момент - проблема не у отвечающих, проблема у тебя.


 
Мефисто   (2006-07-12 19:04) [64]


> MikProg ©   (12.07.06 10:00) [13]


Присоеденяюсь к пердыдущим коллегам.

Семество блоков try... уже должно быть на уровне рефлексов


 
MikProg ©   (2006-07-12 20:30) [65]


> Каждая RTTI создается при инициализации каждой RTL.

Пример для монолитного экзешника?


 
MikProg ©   (2006-07-12 20:35) [66]


> Тут такой момент - проблема не у отвечающих, проблема у
> тебя.

Как это вы заметили. Если бы эта была проблема отвечающих они бы давали советы если не как устранить, то как локализовать проблему. А пока они (сорри народ ничего персонального) блещут эрудицией и не более.


 
MikProg ©   (2006-07-12 20:45) [67]


> Семество блоков try... уже должно быть на уровне рефлексов

т.е. подразумевается, что дельфа может еще и маскировать ошибки?

а как же вот это

procedure       _StartExe(InitTable: PackageInfo; Module: PLibModule);
begin
 RaiseExceptionProc := @RaiseException;
 RTLUnwindProc := @RTLUnwind;
{$ENDIF}
 InitContext.InitTable := InitTable;
 InitContext.InitCount := 0;
 InitContext.Module := Module;
 MainInstance := Module.Instance;
{$IFNDEF PC_MAPPED_EXCEPTIONS}
 SetExceptionHandler;
{$ENDIF}
 IsLibrary := False;
 InitUnits;
end;

и

procedure       SetExceptionHandler;
asm
 XOR     EDX,EDX                 { using [EDX] saves some space over [0] }
 LEA     EAX,[EBP-12]
 MOV     ECX,FS:[EDX]            { ECX := head of chain                  }
 MOV     FS:[EDX],EAX            { head of chain := @exRegRec            }

 MOV     [EAX].TExcFrame.next,ECX
{$IFDEF PIC}
 LEA     EDX, [EBX]._ExceptionHandler
 MOV     [EAX].TExcFrame.desc, EDX
{$ELSE}
 MOV     [EAX].TExcFrame.desc,offset _ExceptionHandler
{$ENDIF}
 MOV     [EAX].TExcFrame.hEBP,EBP
{$IFDEF PIC}
 MOV     [EBX].InitContext.ExcFrame,EAX
{$ELSE}
 MOV     InitContext.ExcFrame,EAX
{$ENDIF}
end;

Т.е. try except уже есть вокруг всей программы. Просто обрабатка делегирована АПИ ОС

ну и далее

procedure InitUnits;
var
 Count, I: Integer;
 Table: PUnitEntryTable;
 P: Pointer;
begin
 if InitContext.InitTable = nil then
   exit;
 Count := InitContext.InitTable^.UnitCount;
 I := 0;
 Table := InitContext.InitTable^.UnitInfo;
{$IFDEF LINUX}
 Inc(Cardinal(Table), InitContext.Module^.GOT);
{$ENDIF}
 try
   while I < Count do
   begin
     P := Table^[I].Init;
     Inc(I);
     InitContext.InitCount := I;
     if Assigned(P) then
     begin
{$IFDEF LINUX}
       CallProc(P, InitContext.Module^.GOT);
{$ENDIF}
{$IFDEF MSWINDOWS}
       TProc(P)();
{$ENDIF}
     end;
   end;
 except
   FinalizeUnits;
   raise;
 end;
end;

на этом все! Далее идет код initialization унитов


 
Суслик ©   (2006-07-12 23:35) [68]

ты все же попробуй, что я говорил. если будет ошибка, надо будет дальше разбираться :)


 
Сергей М. ©   (2006-07-13 08:18) [69]


> MikProg ©   (12.07.06 20:30) [65]
> Пример для монолитного экзешника?


Причем здесь "монолитный экзешник" ?
У него своя RTL, обращаясь к ней ты регистрируешь класс в соответствующей RTTI. А где-то далее по ходу работы приложения ты, к примеру,  пытаешься проверить, не зарегистрирован ли этот класс в другом модуле (в bpl или dll), который будучи собранным с иным значением опции линкера Build With Run-Time Packages пользует другой экз-р RTL и RTTI соответственно. Совершенно очевидно, что в такой ситуации GetClass вернет nil.


 
MikProg ©   (2006-07-13 08:38) [70]


> Причем здесь "монолитный экзешник" ?

Давать советы не читая вопрос - моветон. Вы не находите?


 
Сергей М. ©   (2006-07-13 08:50) [71]


> MikProg ©   (13.07.06 08:38) [70]


см.[13]

> ищу причины приводящие к указанному эффекту


Я как раз и привел одну из таких причин.


 
atruhin ©   (2006-07-13 08:59) [72]

> [49] sniknik ©   (12.07.06 14:40)
> > отсюда резонный вопрос - какая разница, указывать const
> или не указывать ?
> для контроля "себя любимого". хотя честно не знал, что оптимизатор
> стал таким умным

Помимо вышеперечисленного большая разница во времени выполнения. При передаче БЕЗ const и var для подсчета ссылок создается неявный:
try
 
finaly
 dec(refcount);
end;
для теста можно измерить скорость выполнения(с const и без const):
function FirstByteLess (S1, S2 : string) : boolean;
begin
 result := S1[1] < S2[1];
end;


 
evvcom ©   (2006-07-13 09:44) [73]

> [39] isasa ©   (12.07.06 14:08)

Передается ссылка, но делается копия в стеке. А это уже не "по ссылке".

> [47] StriderMan ©   (12.07.06 14:25)
> try
>   ...
> except
> //пишем ошибку
> end;
> //  пишем что все ОК

Тогда уж:
try
  ...
  //  пишем что все ОК
except
  //пишем ошибку
end;

2 MikProg: и все же Assign и Rewrite я в своих проектах использовал единожды, но в конце LogRecord после всех Write[ln] делал Flush. Даже если приложение "будет закрыто" без Close файла всё записанное в нем остается.


 
REA   (2006-07-13 10:09) [74]

>RegisterClass[es], выполнившаяся без исключения, гарантирует регистрацию в конкретном экз-ре RTTI.

абсолютно да, но выполнялись они в секции инициализации которую компилятор (линкер, загрузчик bpl, или еще кто то) не вызвал.
Перенес в другую секцию инициализации другого модуля и заработало.
Если дискуссия не придет к какому то выводу и будет не лень сделаю тестовую программу.


 
Сергей М. ©   (2006-07-13 10:20) [75]


> REA   (13.07.06 10:09) [74]


> выполнялись они в секции инициализации которую компилятор
> .. не вызвал


А вот это по сей момент не факт, а лишь домыслы.
То что код секции иниц-ии не отметил себя в файле протокола, еще не говорит о невызове секции.


 
Игорь Шевченко ©   (2006-07-13 10:30) [76]

MikProg ©   (12.07.06 20:35) [66]


> Как это вы заметили. Если бы эта была проблема отвечающих
> они бы давали советы если не как устранить, то как локализовать
> проблему. А пока они (сорри народ ничего персонального)
> блещут эрудицией и не более.


http://www.ln.ua/~openxs/articles/smart-questions-ru.html

Читать наизусть.


 
isasa ©   (2006-07-13 10:40) [77]

evvcom ©   (13.07.06 09:44) [73]
Передается ссылка, но делается копия в стеке. А это уже не "по ссылке".


! Тогда как объяснить одинаковые адреса?
Юрий Зотов ©   (12.07.06 12:45) [33]

Или я чего-то непонимаю?


 
REA   (2006-07-13 11:03) [78]

>А вот это по сей момент не факт, а лишь домыслы.

А я и не говорю, что это факт - это наблюдение и повод для проверки.


 
MikProg ©   (2006-07-13 11:07) [79]


> Читать наизусть.

А можно "почитать наизусть" советы "как правильно давать ответы"? :)


 
Игорь Шевченко ©   (2006-07-13 11:10) [80]

MikProg ©   (13.07.06 11:07) [79]

Я еще раз обращаю твое внимание на то, что проблема у тебя, а не у отвечающих. И решать ее надо тебе, а не им :)



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

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

Наверх




Память: 0.65 MB
Время: 0.051 c
8-1135260332
NailMan
2005-12-22 17:05
2006.08.27
[DShow] Фильтр для настройки яркости и пр.


2-1155146869
Батыр
2006-08-09 22:07
2006.08.27
Где можно скачать Delphi 6 or 7


15-1154384228
Razor
2006-08-01 02:17
2006.08.27
Изучение java


1-1152901145
Vetas
2006-07-14 22:19
2006.08.27
как отловить закрытие приложения из DLL


2-1155038783
GEM
2006-08-08 16:06
2006.08.27
ADOQuery: параметры, запросы и пр.