|
Опубликовано 09.08.2014 02:52 (10 лет назад) # |
Коллеги, есть странная проблема.
В рамках работы над одним проектом, поставил Delphi XE5.
Создал первичный пустой проект, запускаю.
Среда компилит проект и запускает его. Сама при этом виснет и не реагирует ни на что.
Как только закрываешь запусщеный проект, она запускает его снова, уже в нормальном виде, в дебагерном режиме.
Что это за чудо такое? Складывается ощущение, что сначала сред просто запускает ранее откомпиленый экзешник и ждёт когда его закроют.
Кто-нибудь с этим сталкивался? Как это вылечить?
Второй вопрос - на Delphi XE5 не ставится CnPack. Инсталяция проходит, но самой делфе ничего не появляется. |
|
|
|
Опубликовано 09.08.2014 03:54 (10 лет назад) # |
UPD: Это стало происходить со всеми установленными версиями Делфи (6, XE4, XE5) |
|
|
|
Опубликовано 09.08.2014 04:42 (10 лет назад) # |
UPD2: Разобрался. Ректальной чуйкой понял, что дело нечисто (когда откомпиленная программа, уже из эксплорера, запустилась дважды сама из себя) и выклюичл аваст. Всё заработало.
Походу, аваст меня окончательно достал. |
|
|
Инженер‑космогоник
|
Опубликовано 09.08.2014 15:37 (10 лет назад) # |
Меня очень похоже радовал Comodo. |
|
|
Древний организм
|
Опубликовано 10.08.2014 20:22 (10 лет назад) # |
Shirson просто ты любитель извращений (аваст, делфи6, цнпак)... |
|
|
|
Опубликовано 10.08.2014 21:55 (10 лет назад) # |
Ну, я уже на DelphiXE перешёл.
А что посоветуешь в плане замены бесплатного аваста? |
|
|
Копробарон
|
Опубликовано 10.08.2014 22:30 (10 лет назад) # |
Я все дырки закрыл и без антивиря спокойно живу .__. |
|
|
|
Опубликовано 11.08.2014 01:35 (10 лет назад) # |
На виртуалке внутри виртуалки? |
|
|
Древний организм
|
Опубликовано 11.08.2014 04:17 (10 лет назад) # |
Shirson у меня на ноуте стоит касперский (и то только потому, что батя пользуется второй копией, так что он есть потому что есть), На настольнике стоит последняя адекватная винда обновленная и её ничто не трогает. |
|
|
|
Опубликовано 11.08.2014 10:31 (10 лет назад) # |
У меня там где винда, а это только игровой ком дома. Стоит мелкомягкий антивирь дефолтовый на семерке. Проблем, вроде, с ним не было. |
|
|
|
Опубликовано 19.08.2014 07:49 (10 лет назад) # |
Столкнулся со странным поведением функции SetRoundMode... Иногда она не отрабатывает... Втыкнул в нее ассёрт на соответствие GetRoundMode = запрошенному на установку, периодически срабатывает, в зависимости от атмосферных бурь на юпитере. Это просто какой то бред... Функции RoundUp, RoundDown каждый раз устанавливают свой RoundMode. И если я округляю переменную real = 5 я ожидаю получить что угодно, кроме 4, который дает не поменянный RoundMode = rmDown. А этих RoundUp и RoundDown в коде может быть много. Используется Delphi 6, тестилось в Win8 x64, Win7 x32. Есть какие то мысли по этому поводу? |
|
|
|
Опубликовано 19.08.2014 15:04 (10 лет назад) # |
http://stackoverflow.com/questions/565797/setroundmodermup-and-rounding-round-values-like-10-results -in-10-0001-how-c
редакция от Shirson, 19.08.2014 15:05 |
|
|
|
Опубликовано 19.08.2014 16:32 (10 лет назад) # |
2Shirson:
натыкался на эту ссылку, там речь насколько я понял, про другое.
В моем случае, SetRoundMode который устанавливает какой то флаг у FPU, не всегда его корректно устанавливает. Т.е. в большинстве случаев после SetRoundMode(rmDown), он нормально установится, но иногда он просто не устанавливает. Т.е. банально кусок кода:
var
Five : real;
RoundedFive : real;
.....
Five := 5;
x := RoundDown(SomeNumber);
RoundedFive := Round(Five);
выполненный много раз, в конце концов может выдасть в RoundedFive не 5, а 4, потому что RoundDown вызовет SetRoundMode(rmDown), потом Round(), потом попытается восстановить SetRoundMode(PreviousRoundMode), который отработает вхолостую, не поменяв RoundMode, который так и останется равным rmDown. |
|
|
|
Опубликовано 19.08.2014 17:33 (10 лет назад) # |
Берёшь цикл из 1 000 000 итераций и делаешь вышеописанное. Все промахи и несработки считаешь. Если несработки есть - можно писать багрепорт. Если несработок нет, то проблема где-то у тебя в программе, где нерегестрируемо ставится другой режим округления. |
|
|
|
Опубликовано 19.08.2014 18:37 (10 лет назад) # |
цикл из 1 000 000 операций ничего не даст. несработка зависит от погоды на юпитере.
нерегистрируемо ставиться другой режим округления тоже не может.
сделал свою SetRoundMode, которая ставит и сразу проверяет на заявленный, смогла ли поставить. иногда получается что не смогла. Причина скорее всего внешняя. Типа запросили открыть файл - файл занят.
багрепорт тоже не поможет. кому его писать? делфи 6 давно уже никто не поддерживает. да и проблема не в делфях, а в том что этот флаг не ставится иногда. в плюсах у установки флага скорее всего точно такая же реализация.
грешил на потоки, но у каждого потока свое окружение и свой флаг. |
|
|
Древний организм
|
Опубликовано 20.08.2014 06:39 (10 лет назад) # |
Не надо использовать real, он давно запрещен в делфи, еще лет 10 назад был. |
|
|
|
Опубликовано 28.08.2014 15:22 (10 лет назад) # |
Обнаружил прикольную штуку в старых дельфах.. При вызове AssignFile с длиной имени файла > 260 происходит переполнение буфера... проверено в 6 и XE5.
p.s. можно использовать в своих коварных целях:) |
|
|
|
Опубликовано 28.08.2014 16:28 (10 лет назад) # |
Может, больше 255? Версия винды, на которой проверялось? |
|
|
|
Опубликовано 28.08.2014 17:05 (10 лет назад) # |
Daemon написал:
Может, больше 255? Версия винды, на которой проверялось?
нет, если заглянешь в исходники system.pas, то увидишь:
{ Typed-file and untyped-file record }
TFileRec = packed record (* must match the size the compiler generates: 332 bytes *)
Handle: Integer;
Mode: Word;
Flags: Word;
case Byte of
0: (RecSize: Cardinal); // files of record
1: (BufSize: Cardinal; // text files
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PChar;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..32] of Byte;
Name: array[0..259] of Char; );
end;
{ Text file record structure used for Text files }
PTextBuf = ^TTextBuf;
TTextBuf = array[0..127] of Char;
TTextRec = packed record (* must match the size the compiler generates: 460 bytes *)
Handle: Integer; (* must overlay with TFileRec *)
Mode: Word;
Flags: Word;
BufSize: Cardinal;
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PChar;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..32] of Byte;
Name: array[0..259] of Char;
Buffer: TTextBuf;
end;
тип File на самом деле является одной из этих записей. смотрим далее:
function _Assign(var t: TTextRec; const s: String): Integer;
begin
FillChar(t, sizeof(TFileRec), 0);
t.BufPtr := @t.Buffer;
t.Mode := fmClosed;
t.Flags := tfCRLF * Byte(DefaultTextLineBreakStyle);
t.BufSize := sizeof(t.Buffer);
t.OpenFunc := @TextOpen;
Move(S[1], t.Name, Length(s));
t.Name[Length(s)] := #0;
Result := 0;
end;
Здесь видно, что S копируется в t.Name полностью. Т.е. если длина строки > 260, то затрет дальше за пределами t.Name.
Проверялось на Win8 и 7.
редакция от MysticCoder, 28.08.2014 17:09 |
|
|