![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access violation и MapViewOfFile [D5, Win2k]
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.