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