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-13 13:02:00) [21]


> Про ChangeFileExt не забывай.
>

Это глюк такой - я прекрасно знаю о ее существовании, но за последние сто лет ни разу не использовал.
"Вы хотите поговорить об этом?" ©


MikProg   (2006-07-13 12:59:00) [22]


> или предоставляй всю информацию для воспроизведения своей
> проблемы,

Включите здравый смысл:
Если бы я знал в чем заключается всяинформация, я бы ее уже дал.
Если добровольные помощники знали в чем заключается всяинформация, то они бы ее уже запросили.
А пока имеем ... то что имеем :)
"Дохтор, у меня это!"  ©


evvcom   (2006-07-13 12:51:00) [23]

> [77] isasa ©   (13.07.06 10:40)

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


han_malign   (2006-07-13 12:50:00) [24]

OFFTOP

> Это как это? Мне надо получить адрес объекта. Какая копия?

- ты этот адрес не только получаешь, но и передаешь
  procedure StrInfo(aCmnt: string; str: Pointer);
  type
    PStrRec = ^StrRec;
    StrRec = packed record
      refCnt: Longint;
      length: Longint;
    end;
  var _p: PStrRec;
  begin
     _p:= PStrRec(str);
     if(_p = nil)then Writeln(aCmnt, ': nil')
     else begin
        dec(_p);
        Writeln(aCmnt, ': [',HexDWORD(DWORD(str)),'] Ref: ', _p.refCnt)
     end;
  end;
var _s: string;
  procedure ByVal(s: string);
  begin
     StrInfo('ByValO   ', Pointer(_s));
     StrInfo('ByValP   ', Pointer(s));
     Writeln(HexDWORD(DWORD( @s[1])));
     StrInfo('ByValO~  ', Pointer(_s));
     StrInfo('ByValP~  ', Pointer(s));
  end;
OUTPUT:
ByValO   : [0083000C] Ref: 2
ByValP   : [0083000C] Ref: 2
0083001C
ByValO~  : [0083000C] Ref: 1
ByValP~  : [ 0083001C] Ref: 1


isasa   (2006-07-13 12:36:00) [25]

han_malign ©   (13.07.06 12:10) [87]
- разницы нет, просто ты совершаешь действие которое может потенциально привести к изменению строки(передача в функцию @s[1]), поэтому делается UniqueString(уже внутри функции)...


Это как это? Мне надо получить адрес объекта. Какая копия?
@s[1] == addr(s[1]) - использую для передачи адреса буфера, что не так.


han_malign   (2006-07-13 12:10:00) [26]

OFFTOP

> Разница, все таки, есть. А то я начал волноваться.

- разницы нет, просто ты совершаешь действие которое может потенциально привести к изменению строки(передача в функцию @s[1]), поэтому делается UniqueString(уже внутри функции)... Так что волнуйся дальше.
А неявный try finaly - действительно имеет место...


GrayFace   (2006-07-13 12:00:00) [27]

isasa ©   (12.07.06 14:08) [39]
Так это, я тут напрягся и вспомнил, что передача параметра по значению еще со времен Турбо-Паскаля - только то, что меньше или равно длине регистра. :)
Остальное, все равно, по ссылке.

Насколько я знаю, ShortString, массивы конечной длины и record'ы передается по значению. Впрочем, сам тестов не гонял.

MikProg ©   (12.07.06 14:52) [55]
function LogFileName: string;

Про ChangeFileExt не забывай.


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

MikProg ©   (13.07.06 11:30) [83]


> Ну и...? Че дальше то?


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


Сергей М.   (2006-07-13 11:39:00) [29]


> MikProg ©   (13.07.06 11:24) [82]


Цитата из справки:

..in Delphi, the application first executes the initialization section of allthe units used by the application

Борланд, по-твоему, врет ?


MikProg   (2006-07-13 11:30:00) [30]


> И решать ее надо тебе, а не им :)

Ну и...? Че дальше то? Вы не читали хохму про "реалтайм" удаление аппендицита отоларингологом по советам в чате. Здесь все идет по тому сценарию. Пока не хватает только одного персонажа - того который все опошлит. :)


MikProg   (2006-07-13 11:24:00) [31]


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

"код секции иниц-ии не отметил себя в файле протокола" и не произшло возникновение исключительной ситуации.
А теперь говорит?


isasa   (2006-07-13 11:16:00) [32]

Немного изуродовал, для детализации. Разница, все таки, есть. А то я начал волноваться. :)

procedure TForm1.FormCreate(Sender: TObject);
begin
FStr := 'Bill Gates';
end;

procedure WithoutVarAndConst(S: string);
begin
//  S := S + ';';
  Form1.memo1.Lines.Add(Format('@FStr: %p, @S: %p, @FStr[1]: %p, @S[1]: %p, FStr: %s, S: %s',
  [@Form1.FStr, @S, @Form1.FStr[1], @S[1], Form1.FStr, S]));
end;

procedure WithVar(var S: string);
begin
  Form1.memo1.Lines.Add(Format('@FStr: %p, @S: %p, @FStr[1]: %p, @S[1]: %p, FStr: %s, S: %s',
  [@Form1.FStr, @S, @Form1.FStr[1], @S[1], Form1.FStr, S]));
end;

procedure WithConst(const S: string);
begin
  Form1.memo1.Lines.Add(Format('@FStr: %p, @S: %p, @FStr[1]: %p, @S[1]: %p, FStr: %s, S: %s',
  [@Form1.FStr, @S, @Form1.FStr[1], @S[1], Form1.FStr, S]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WithoutVarAndConst(FStr)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
WithVar(FStr)
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
WithConst(FStr)
end;

Результат

@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


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

MikProg ©   (13.07.06 11:07) [79]

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


MikProg   (2006-07-13 11:07:00) [34]


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

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


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

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

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


isasa   (2006-07-13 10:40:00) [36]

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


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

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


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

MikProg ©   (12.07.06 20:35) [66]


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


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

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


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


> REA   (13.07.06 10:09) [74]


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


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


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

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

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


evvcom   (2006-07-13 09:44:00) [40]

> [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 файла всё записанное в нем остается.


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

Наверх

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