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 модулей !!! Это полный трындец! Я понимаю что могу грубо регистрировать классы где нибудь в одном месте, но это есть покушение на устои! Кто нибудь может объяснить?


MikProg   (2006-07-16 09:13:00) [1]

Удалено модератором
Примечание: Offtopic


Суслик   (2006-07-16 00:30:00) [2]

Удалено модератором
Примечание: Offtopic


MikProg   (2006-07-15 23:47:00) [3]

Удалено модератором
Примечание: Offtopic


Игорь Шевченко   (2006-07-15 22:07:00) [4]

MikProg ©   (15.07.06 21:59) [108]


> Что? От порядка зависит кто вообще будет инициализирован,
>  а кто упадет в игнор?


Ты переоцениваешь мои телепатические способности - я не знаю твоего кода.


>  Невозможно тестировать весь код!


Возможно.


MikProg   (2006-07-15 21:59:00) [5]


> Изменился порядок выполнения секций Initialization

Что? От порядка зависит кто вообще будет инициализирован, а кто упадет в игнор?

>  нужно запоминить, что с initialization бывают некоторые
> глюки,

Похоже я перестану их использовать. Невозможно тестировать веськод!


Суслик   (2006-07-15 11:33:00) [6]


> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?

1. нужно сказать спасибо Диме Тимохову :)
2. нужно запоминить, что с initialization бывают некоторые глюки, но их точно не бывает, если все используемые модуля приведены с проекте или в пакетах (если ты их используешь).

ЗЫ. На самом деле с пакетами там тоже не все просто. Ситуация (я тут о ней спрашивал но ушло в историю).
1. есть приложение А
2. есть пакет Б, который приложение А загружает с использованием loadpackage.
3. есть пакет В, который указан в секции requires пакета Б, но про него не знает ничего приложение А.
4. в пакете В есть два модуля М1 и М2.
5. М1 используется (есть в секции uses) в одном из модулей пакета Б.
6. М2 не используется ниииииигде.
В итоге секция инициализации в М2 выполнена не будет.

ЗЫЫ. Надеюсь в примере не ошибся. :)
В итоге при


Суслик   (2006-07-15 11:33:00) [7]


> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?

1. нужно сказать спасибо Диме Тимохову :)
2. нужно запоминить, что с initialization бывают некоторые глюки, но их точно не бывает, если все используемые модуля приведены с проекте или в пакетах (если ты их используешь).

ЗЫ. На самом деле с пакетами там тоже не все просто. Ситуация (я тут о ней спрашивал но ушло в историю).
1. есть приложение А
2. есть пакет Б, который приложение А загружает с использованием loadpackage.
3. есть пакет В, который указан в секции requires пакета Б, но про него не знает ничего приложение А.
4. в пакете В есть два модуля М1 и М2.
5. М1 используется (есть в секции uses) в одном из модулей пакета Б.
6. М2 не используется ниииииигде.
В итоге секция инициализации в М2 выполнена не будет.

ЗЫЫ. Надеюсь в примере не ошибся. :)
В итоге при


Суслик   (2006-07-15 11:33:00) [8]


> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?

1. нужно сказать спасибо Диме Тимохову :)
2. нужно запоминить, что с initialization бывают некоторые глюки, но их точно не бывает, если все используемые модуля приведены с проекте или в пакетах (если ты их используешь).

ЗЫ. На самом деле с пакетами там тоже не все просто. Ситуация (я тут о ней спрашивал но ушло в историю).
1. есть приложение А
2. есть пакет Б, который приложение А загружает с использованием loadpackage.
3. есть пакет В, который указан в секции requires пакета Б, но про него не знает ничего приложение А.
4. в пакете В есть два модуля М1 и М2.
5. М1 используется (есть в секции uses) в одном из модулей пакета Б.
6. М2 не используется ниииииигде.
В итоге секция инициализации в М2 выполнена не будет.

ЗЫЫ. Надеюсь в примере не ошибся. :)
В итоге при


Игорь Шевченко   (2006-07-14 23:26:00) [9]


> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?


Изменился порядок выполнения секций Initialization


MikProg   (2006-07-14 22:44:00) [10]

Проблема решилась включением LayerBase в проект. Чтобы это значило?


evvcom   (2006-07-14 09:34:00) [11]

> [96] han_malign ©   (13.07.06 14:03)

Посмотрел код. Действительно оптимизатор оказался не причем. Разница в вызовах с const и без const и var в вызове функции System._LStrAddRef. Но согласитесь, что string все же особенный тип. Поэтому без шаманства все же тут не обходится. Единственное в чем я ошибся, это в шамане. :) Компилятор тут колдует.
Ну а если взять "простой" тип, то при передаче по значению попросту происходит копирование параметра в стеке:
type TRec = record
 aa: Integer;
 bb: Integer;
end;

function SumWithConst(const rec: TRec): Integer;
begin
 Result := rec.aa + rec.bb;
end;

function SumWithoutVarAndConst(rec: TRec): Integer;
begin
 Result := rec.aa + rec.bb;
end;

В результате (оптимизатор выключен):
SumWithConst:begin
push ebp
mov ebp,esp
add esp,-$08
mov [ebp-$04],eax

SumWithoutVarAndConst:begin
push ebp
mov ebp,esp
add esp,-$0c
push esi
push edi
mov esi,eax
lea edi,[ebp-$08]
movsd
movsd


Вот те и копирование. Хотя никакого присвоения не происходит. Так что все-таки

> [49] sniknik ©   (12.07.06 14:40)
> не знал, что оптимизатор стал таким умным

не настолько уж он умён. Кстати и со стрингами, все же вызывается лишний раз (без const) System._LStrAddRef, хотя в коде не предполагалось никаких изменений стринга. Это адреса стрингов не изменились, но подготовка к возможному изменению все же была проведена.


Игорь Шевченко   (2006-07-13 16:40:00) [12]

MikProg ©   (13.07.06 16:20) [100]


> Вам самому времени не жалко?


Я вот ссылку дал, несколькими постами раньше. Ее бы почитать неплохо, там все написано, и про мое время, в том числе :)


MikProg   (2006-07-13 16:20:00) [13]


> Нет, просто никому не интересно тебе помогать. Только и
> всего.
>

Зато как интересно рассказывать как бы вы мне замечательно помогли, если бы я  вел себя "правильно". Вам самому времени не жалко?


Игорь Шевченко   (2006-07-13 15:10:00) [14]

MikProg ©   (13.07.06 14:18) [97]


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


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


> А когда помогаешь по дружбе - совсем другое дело.


А если не затруднит, ты не скажешь, кому ты на данном форуме успел помочь по дружбе ? :)


> Так ведь и развел. Только оно в действительности оказалось
> "слабо".


Нет, просто никому не интересно тебе помогать. Только и всего.


MikProg   (2006-07-13 14:21:00) [15]

Удалено модератором
Примечание: Offtopic


MikProg   (2006-07-13 14:18:00) [16]


> Если проблема не воспроизводится, значит, проблемы нет.

Именно так я обслуживаю клиентуру за деньги. Вы же не платный саппорт? Если бы вы им были то я и разговаривал с вами по другому. А когда помогаешь по дружбе - совсем другое дело. Другу я честно отвечу "не знаю", а не начну дурить мозги что "это не баг, это фича" ©.

> дать всю информацию более опытным товарищам.

Которые, в абсолютном большинстве случаев, смогут дать ответ только если уже сталкивались с подобной хренью вживую (вы то сами верите, что господа "опытные товарищи" бросятся воспроизводить оперативную обстановку, чтобы помочь мне :) или верите что все проблемы они могут решить слегка наморщив лоб? :)) ).
Собс-но об этом и вопрос: "Кто наступал на такие грабли?" Ответ пока: 1(один) и совсем по другому поводу и его решение совпадает с моим (которое меня не удовлетворяет).


> Можно всех на "слабо" развести ;-)

Так ведь и развел. Только оно в действительности оказалось "слабо". :)


han_malign   (2006-07-13 14:03:00) [17]

OFFTOP

> Это частный случай шаманства оптимизатора.

- нет, это общий случай передачи по значению "smart pointer" динамических объектов. Оптимизатор здесь вообще не причем.

> Не будем лезть в детали(счетчик ссылок, длина). Разница
> более чем в 16 байт (2 x long). Да и видно, где прямая адресация,
>  а где косвенная.

- разница появляется ВНУТРИ функции, при передаче параметра КОПИРОВАНИЯ НЕ ПРИСХОДИТ, адресация в данном случае - всегда прямая. Строка копируется ТОЛЬКО при изменении, или действиях которые МОГУТ привести к изменению.

  procedure ByVal(s: string);
  begin
     StrInfo('ByValO   ', Pointer(_s));
     StrInfo('ByValP   ', Pointer(s));
      if( Pointer(s) <> @s[1])
     then Writeln('Pointer(s) <> @s[1]')
     else Writeln('Pointer(s) = @s[1]');

     Writeln(HexDWORD(DWORD(@s[1])));
     StrInfo('ByValO~  ', Pointer(_s));
     StrInfo('ByValP~  ', Pointer(s));
  end;
OUTPUT:
ByValO   : [0083000C] Ref: 2
ByValP   : [0083000C] Ref: 2
Pointer(s) =@s[1]
0083001C
ByValO~  : [0083000C] Ref: 1
ByValP~  : [0083001C] Ref: 1


Плохиш   (2006-07-13 13:38:00) [18]


> Игорь Шевченко ©   (13.07.06 13:05) [94]

Тааак долго :-( Можно всех на "слабо" развести ;-)


Игорь Шевченко   (2006-07-13 13:05:00) [19]

MikProg ©   (13.07.06 12:59) [91]


> Включите здравый смысл:
> Если бы я знал в чем заключается вся информация, я бы ее
> уже дал.


Включил. Поясняю: Если проблема воспроизводится у тебя, значит, у тебя есть вся информация по ней, которую ты вполне можешь дать. Если проблема не воспроизводится, значит, проблемы нет. Если проблема не воспроизводится у тебя, но воспроизводится в ближайшем окружении, ты можешь найти 10 отличий своего окружения от того, где воспроизводится проблема, устранить их, воспроизвести проблему, и если после этого она не решится, дать всю информацию более опытным товарищам.


isasa   (2006-07-13 13:03:00) [20]

Ладно, утомили. :)
Не будем лезть в детали(счетчик ссылок, длина). Разница более чем в 16 байт (2 x long). Да и видно, где прямая адресация, а где косвенная.
Результат

@FStr: 008F1D40, @S: 0012F624, @FStr[1]: 008F2004, @S[1]: 008F4200, FStr: Bill Gates, S: Bill Gates
@FStr: 008F1D40, @S: 008F1D40, @FStr[1]: 008F2004, @S[1]: 008F2004, FStr: Bill Gates, S: Bill Gates
@FStr: 008F1D40, @S: 0012F624, @FStr[1]: 008F2004, @S[1]: 008F2004, FStr: Bill Gates, S: Bill Gates


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

Наверх

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