Форум: "Основная";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];
ВнизWindows 7 64 bit и SetLength Найти похожие ветки
← →
Alex_C (2009-12-23 20:55) [0]Так как сейчас в моем распоряжении нет компьютера с Windows 7 64 bit прошу прояснить следущую ситуацию: пользовательская программа у одного из моих пользователей на данной операционке ведет себя как то странно:
первый раз - запускается и работае без проблем.
Второй раз запускаем - выдает сообщения:
Exception ERegistryException in module...
Failed to set data for "".
- Это сообщение винды.
Далее следует пойманый exception моей программы:
Can"t allocate memory for flags file!
Вот код где это происходит:
var
FlagBuffer: array of byte;
procedure LoadFlagFileToBuffer;
var
FSize, CurrRead, TotalRead: integer;
FlagFile: integer;
PFlagBuffer: ^byte;
begin
FlagFile := FileOpen(ExtractFilePath(ParamStr(0)) + "flags.dll", fmShareDenyNone);
FSize := GetFileSize(ExtractFilePath(ParamStr(0)) + "flags.dll");
try
SetLength(FlagBuffer, FSize);
PFlagBuffer := @FlagBuffer[0];
try
... данный код пропущен, т.к. он вызывает уже другое сообщение Except...
except
Application.MessageBox("Can""t load flag file!", "Error!", MB_OK);
end;
except
Application.MessageBox("Can""t allocate memory for flags file!", "Memory error!", MB_OK);
end;
FileClose(FlagFile);
TotalFlags := FSize div 108;
end;
Получается что ошибка возникает при попытке
SetLength(FlagBuffer, FSize);
Программа работает у более чем 200 пользователей на операционках от Win98 до Windows 7 32 bit без проблем.
А тут на 64 bit - проблема...
Есть какие нибудь идеи?
← →
Palladin © (2009-12-23 20:57) [1]ну например заЮзать FastMM
← →
Alex_C (2009-12-23 20:58) [2]Да при завершении программы выполняется
procedure FeeFlagBuffer;
begin
SetLength(FlagBuffer, 0);
end;
← →
Alex_C (2009-12-23 20:59) [3]Юзаю FastMM.
Может конечно не последней версии - завтра проверю!
Спасибо за идею!
← →
MBo © (2009-12-23 21:01) [4]Есть уверенность, что FSize ненулевой?
← →
Alex_C (2009-12-23 21:09) [5]
> Есть уверенность, что FSize ненулевой?
Ну если в первый раз выполняется - значит все верно.
Да у меня тоже есть некоторые сомнения на счет
FSize := GetFileSize(ExtractFilePath(ParamStr(0)) + "flags.dll");
Собственно выбора то особо и нет.
Ну а почему во второй раз работы программы он нулевым становится?
← →
Alex_C (2009-12-23 21:14) [6]А я вот сейчас подумал - а не тут ли ошибка:
PFlagBuffer := @FlagBuffer[0];
ведь
PFlagBuffer: ^byte;
не маловато ли для 64 разрядной системы?
← →
Palladin © (2009-12-23 21:27) [7]а не маловата ли редиска для огорода )
← →
Игорь Шевченко © (2009-12-23 21:56) [8]а вместо SetLength и извратов с дин. массивом тупо GetMem делать ?
← →
Alex_C (2009-12-23 21:58) [9]
> а вместо SetLength и извратов с дин. массивом тупо GetMem
> делать ?
Да попробую...
Но что ж получается - у меня не один в программе SetLength - чтож везде менять?
← →
sniknik © (2009-12-23 22:38) [10]
except
Application.MessageBox("Can""t load flag file!", "Error!", MB_OK);
end;
except
Application.MessageBox("Can""t allocate memory for flags file!", "Memory error!", MB_OK);
end;
честное слово, доведут, буду предлагать убивать за такое (пока только увольнять). а потом еще и плачутся, "а что там такое? есть ли идеи?"
НЕЛЬЗЯ ПРЯТАТЬ ОШИБКИ. обработка их это не замена на своими, это совсем совсем другое.
еще хорошо первая проскочила, не ожидал видать там, не успел "обработать". %)
← →
Игорь Шевченко © (2009-12-23 23:58) [11]
> буду предлагать убивать за такое
Я поддержу, если что.
← →
Alex_C (2009-12-24 08:58) [12]
> НЕЛЬЗЯ ПРЯТАТЬ ОШИБКИ. обработка их это не замена на своими,
> это совсем совсем другое.
Да я совершенно с этим согласен. Только скажите тогда: вот сейчас мне мой пользователь написал мое замененное сообщение об ошибке - сейчас мне хотя бы понятно, в каком месте программы она выскочила.
Ну хорошо - уберу я свою обработку ошибки. Напишет мне пользователь сообщение об шибики которое винда выдает и что??? Как я пойму в каком месте программы оно получается?
← →
RWolf © (2009-12-24 09:21) [13]
> а вместо SetLength и извратов с дин. массивом тупо GetMem
> делать ?
тогда придётся следить за освобождением памяти самому.
← →
sniknik © (2009-12-24 09:35) [14]> Как я пойму в каком месте программы оно получается?
нормально обрабатывать, это что то вроде - вести лог с записью когда, где, класс ошибки, и реальное сообщение ошибки (не авторский перевод, не отсебятину а именно реальное). т.е. она должна давать всю значимую информацию, а не скрывать просто ради "привет, я случилося здеся!".
т.е. если нормально то не только поймешь, а тебе могут даже на почту отчет выслать (есть и такие логеры которые так делают).
← →
Alex_C (2009-12-24 11:13) [15]Ну хорошо.
Если отвлечься от кода:
программа давно работает у большого количества пользователей на разных версиях винды. Вопрос: что принципиального может повлиять на работу программы в 64-битной версии Windows 7 (особенно если учитывать, что в 32-битной версии все работает)?
И самый главный вопос: первый раз программа запускается и работает. Повторно - ошибка.
← →
RWolf © (2009-12-24 11:55) [16]ну так какая ошибка-то? с этого же нужно начинать отладку. А чтобы выяснить — нужно заменить сообщение в обработчике ошибки на вменяемое.
← →
sniknik © (2009-12-24 12:18) [17]первое вменяемое (забытое для обработки) сообщение
> Exception ERegistryException in module...
> Failed to set data for "".
нет доступа(ошибка реестра) к реестру, что то не инициализировалось, т.е. либо nil либо "испорченная" память...
в общем если на догадках то замена на нормальные сообщения даст там AV (делайте ставки господа ;))
> Если отвлечься от кода:
>...
> особенно если учитывать, что в 32-битной версии все работает
а почему у меня не работает холодильник? таких как у меня у большого количества пользователей, что принципиально может на него влиять? (особенно если учесть, что даже у соседа работает, а у него такой же...).
← →
sniknik © (2009-12-24 12:28) [18]там бы еще по хорошему сделать типа
FSize := GetFileSize(ExtractFilePath(ParamStr(0)) + "flags.dll");
Win32Check(FSize<>$FFFFFFFF);
← →
Slym © (2009-12-29 05:56) [19]
var
FlagBuffer:TMemoryStream;
TotalFlags: integer;
PFlagBuffer: ^byte;
begin
FlagBuffer:=TMemoryStream.Create;
try
FlagBuffer.LoadFromFile(ExtractFilePath(ParamStr(0))+"flags.dll");
TotalFlags := FlagBuffer.Size div 108;
PFlagBuffer:= FlagBuffer.Memory;
try
//... данный код пропущен, т.к. он вызывает уже другое сообщение Except...
except
Application.MessageBox("Can""t load flag file!", "Error!", MB_OK);
//тут плохо ну хотябы аборт
abort;
end;
finally
FlagBuffer.Free;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c