Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
1-1261590906
Alex_C
2009-12-23 20:55
2011.08.14
Windows 7 64 bit и SetLength


15-1303455017
И. Павел
2011-04-22 10:50
2011.08.14
В ICQ стучатся незнакомые люди :)


2-1304652940
Cerg
2011-05-06 07:35
2011.08.14
В чем ошибка?


15-1303504190
Юрий
2011-04-23 00:29
2011.08.14
С днем рождения ! 23 апреля 2011 суббота


2-1304456694
ProgRAMmer Dimonych
2011-05-04 01:04
2011.08.14
SB_VERT и отсечение (WinAPI only)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский