Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

SetFilePointer не перемещает указатель файла за 2Гб   Найти похожие ветки 

 
jTommy   (2005-11-27 02:43) [0]

Мастера, помогите. Пишу программу, которая читает данные из файла. Если файл больше 2Гб и нужно переместить указатель за этот предел, SetFilePointer не срабатывает.
При включенном Range Checking случается исключение ERangeError, при выключенном - указатель просто не переходит на нужную позицию.
Код такой:
SetFilePointer(hArch, Int64Rec(DataOffset).Lo, Pointer(Int64Rec(DataOffset).Hi), FILE_BEGIN);
Попробовал написать через TFileStream - то же самое. :(


 
sniknik ©   (2005-11-27 03:09) [1]

> Pointer(Int64Rec(DataOffset).Hi)
не значение приведенное к указателю, а указатель на значение. в этом все дело , похоже.
т.е. @Int64Rec(DataOffset).Hi вместо этого.


 
Lamer@fools.ua ©   (2005-11-27 11:20) [2]

На Win2K и старше можно использовать SetFilePointerEx(). Она поудобнее будет.


 
jTommy   (2005-11-27 14:19) [3]

@sniknik:
Да, действительно, ты прав. В исходниках дельфи(функция FileSeek) точно также написано. Но у меня выдает ошибку "Variable required", приходится писать так:
n:=Int64Rec(DataOffset).Hi;
SetFilePointer(hArch, Int64Rec(DataOffset).Lo, @n, FILE_BEGIN);
странно это. Ладно, с этим разобрались, но проблема осталась...
После непродолжительного изучения исходников Дельфи решение было найдено. В функции SetFilePointer смещение имеет тип LONG что тоже самое, что и Integer. А поля Lo и Hi записи Int64Rec имеют тип Cardinal. Вот здесь-то вся и проблема. Переопределив запись Int64Rec:

 Int64Rec = packed record
   case Integer of
     0: (Lo, Hi: Integer);
     1: (Cardinals: array [0..1] of Cardinal);
     2: (Words: array [0..3] of Word);
     3: (Bytes: array [0..7] of Byte);
 end;

все правильно заработало.
Как я уже писал выше, такой прием используется в функции FileSeek. А она используется в TFileStream, получается, что все программы написанные на дельфи с использованием этого класса глючат с файлами больше 2Гб.


 
Lamer@fools.ua ©   (2005-11-27 17:13) [4]

>0: (Lo, Hi: Integer);
Это неправильно. Правильно так:
0: (Lo: LongWord; Hi: LongInt);



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.015 c
1-1135935500
__oleg
2005-12-30 12:38
2006.02.05
Scrool в TStringGrid


15-1137279478
Volf_555
2006-01-15 01:57
2006.02.05
Разблокирование возможностей компьютера


15-1137252416
McSimm
2006-01-14 18:26
2006.02.05
Обнаружено сканирование портов с адреса delphimaster.ru


15-1137183315
geokis
2006-01-13 23:15
2006.02.05
отладка в Delphi 6


15-1137138666
data
2006-01-13 10:51
2006.02.05
Ищу книгу Иосифа Дика "В дебрях Кара-Бумбы". Нужно сыну





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский