Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Access violation и MapViewOfFile [D5, Win2k]


Страницы:   1 2

man Yury ©   (2008-11-29 12:05:00) 

Доброе утро/день All.
Кто может обьяснить почему возникает ошибка [B]Access Violaion[/B] и направить на путь истинный в следующем коде (при открытии файла размером кратного 4096 байт на OS Windows2003 SP1 размер кластера 4096 байт)


hFile:=FileOpen(FDirectoryFromSAA+FileForProcess.Name,fmOpenReadWrite);
if hFile=INVALID_HANDLE_VALUE then
 break;
hMapping:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,GetFileSize(hFile,nil),ni l);
if hMapping=INVALID_HANDLE_VALUE then
break;
  Data:=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,GetFileSize(hFile,nil));
  i:=strlen(Data);


В строчке  i:=strlen(Data) возникает ошибка (Data: PChar). Проверялось также на примере, который идет к книге Тейксейра и Пачеко Delphi5 Руководство разработчика- FileSRCH (тут вылетает в момент StrPos, где в качестве аргумента используется переменная, указывающая на результат MapViewOfFile).

Судя по всему как-то не "так" выполняется FData:=MapViewOfFile для файлов размером 4096,8192... Почему-то все функции, которые предназначены для работы с PChar вылетают с ошибкой (приведение переменной Pointer к PChar выполнялось)...

Заранее благодарен за ответ.
Юрий.


man Yury   (2008-11-29 12:45:00) [21]

Data - PChar

также пробовал вариант приведения Data:=PChar(MapViewOfFile...)

скажите что попробовать - попробую ... посто незнаю что уже делать ...


Palladin   (2008-11-29 12:42:00) [22]

какого типа Data ?


man Yury   (2008-11-29 12:35:00) [23]

Я пробовал добавлять в код

GetMem(Data,GetFileSize(hFile,nil)+1);
FillChar(Data^,GetFileSize(hFile,nil)+1,#0);


или
результат функции присваивал переменной Pointer(Fdata):=MapViewOfFile
 
 Data:=PChar(FData);
 inc(Data,GetFileSize(hFile,nil));
 Data^:=#0;


результат одинаков Access violation at 0040AD6F accessing 00E22000

дело в том что я взял пример из Тейксейра проверил там тоже ошибка на файле размером 4096 в строке strpos ....

Спасибо за ответ
Юрий


Dimka Maslov   (2008-11-29 12:19:00) [24]

1.
Вопрос: что делает функция strlen?
Ответ: с ч и т а е т количество байт от переданного ей указателя до первого нулевого байта.
Следовательно, если нулевой байт не обнаружен внутри выделенного блока памяти, функция выходит за эти пределы. А доступ туда запрещён, что и вызывает AV.

2.
Если произошла ошибка и Data = nil, то, естественно, все обращения к ней тоже будут генерировать AV.


Страницы:   1 2

Наверх

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