![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Требуется открыть бинарный файл и заполнить массив переменных типа word. Вот мой код:
Код:
var OpenDialog :TOpenDialog; kt:Cardinal; filehandle: THandle; file_inf: TOFStruct; buf: array of word; begin openDialog := TOpenDialog.Create(self); openDialog := TOpenDialog.Create(self); if openDialog.Execute then begin filehandle := OpenFile(PChar(openDialog.FileName),file_inf,OF_READWRITE); size := GetFileSize(filehandle,nil); SetLength(buf,size div 2 + 1 ); ReadFile(filehandle,buf,size,kt,nil); CloseHandle(FileHandle); end; end; Вопрос: почему массив остается незаполненным? Последний раз редактировалось Admin, 31.03.2012 в 17:15. |
#2
|
|||
|
|||
![]() Нужно использовать WriteFile вместо ReadFile.
|
#3
|
|||
|
|||
![]() не, нужно передавать указатель на нулевой элемент @buf[0]
|
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
|
#4
|
||||
|
||||
![]() Лучше использовать CreateFile(...)
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
|
#5
|
||||
|
||||
![]() Весь прикол кода ТС в том, что ему вообще не нужны API-ные команды. После применения:
Код:
openDialog := TOpenDialog.Create(self); их ценность падает до нуля. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
![]() Код:
var OpenDialog :TOpenDialog; kt:Cardinal; filehandle: THandle; buf: array of word; begin openDialog := TOpenDialog.Create(self); if openDialog.Execute then begin filehandle :=CreateFile(pChar(openDialog.FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); size := (GetFileSize(filehandle,nil) div SizeOf(word))+1; SetLength(buf,size); ReadFile(filehandle,buf[0],size,kt,nil); CloseHandle(FileHandle); end; openDialog.Free; end; и для помощи Последний раз редактировалось cotseec, 31.03.2012 в 21:43. |
Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
|
#7
|
||||
|
||||
![]() Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
![]() Спасибо большое всем за помощь, заработало!
Ранее я это выполнил с помощью TFileStream но столкнулся со следующей проблемой - моя программа прерывала работу другой программы, записывающей бинарные данные с детекторного комплекса. Так что идея была - перейти на win api, потому что он дозволяет синхронную работу с файлом двух приложений. Правда теперь возникла другая проблема. С помощью метода seek filestrem'а можно было отслеживать и выводить последние записанные данные, а не заполнять по новой все массивы. А теперь как-то непонятно. Ни у block read, ни у fileread вроде нет возможности читать файл с избранной точки. Что делать? |
#9
|
|||
|
|||
![]() Для TFileStream надо просто передавать в последнем параметре режим открытия, что то типа fmOpenRead Or fsShareWrite (посмиотри в справке). Тогда не будет блокировать.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
|
#10
|
||||
|
||||
![]() Seek (для делфовых файлов и BlockRead), SetFilePointer (WinAPI).
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
|
#11
|
|||
|
|||
![]() Еще раз большое спасибо))
|