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

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

Подскажите, как пользоваться winapi ф-ей ReadFile??? [D6, WinXP]


zam ©   (2002-05-15 20:36:00) 

Не понимаю, как правильно в ф-ю ReadFile передать указатель на буфер приема данных.
При передачи туда PCHAR или String выскакивают ошибки.
Причем даже если выделять память под этот PChar.
Единственное, что у меня работает, это если передать туда строку объявленную следующим образом:
str : string[200];
Но тут естественно не удобно, что длина ограничена в 255 символов.
Подскажите как правильно с этим работать?


Ворчун   (2002-05-16 02:00:00) [1]

2 VuDZ © (15.05.02 22:05)
> str: PChar[255];
Для МАСТЕРА - непозволительны такие глупости!


zam   (2002-05-16 01:18:00) [2]

Большое спасибо, действительно не додумался:))))


SPeller   (2002-05-16 00:49:00) [3]

А по-моему проще так:

var buf:array of byte;
...

setlength(buf,n);
ReadFile(hFile, buf[0], n, readed, nil);


zam   (2002-05-15 23:03:00) [4]

По поводу str: PChar[255] впервые вижу такую запись, у меня такое Delphi переваривать не хочет.
Да и как можно указателю на char задавать какой-то размер?
Нет, если строка объявлена как str : string[200], то str является указателем на статически выделенную память, поэтому если передавать в качестве буфера эту строку, все работает хорошо.

Но задача состоит в том, чтобы создать буфер динамически после того, как узнаешь, сколько символов находится в файле.

Если писать так:
var
strx: PChar;

begin
getmem(strx,1000);
ReadFile(h1,strx,count,DWORD(Read),nil)
FreeMem(strx,1000);

То выскакивает runtime error access violation
Хотя я не вижу тут ошибок.
Вот рабочий пример MSDN:

lpszBuffer = (LPSTR) GlobalAlloc(GPTR,
lstrlen((LPSTR) achID) + cbMessage);
fResult = ReadFile(hSlot1,lpszBuffer,cbMessage,&cbRead,
(LPOVERLAPPED) NULL);

По-моему мой код полностью идентичен MSDN"овскому.

А по поводу таких полезных советов, как почитать хелп, советуйте в других конференциях.


KaPaT   (2002-05-15 22:22:00) [5]

а хелп недано почитать?


VuDZ   (2002-05-15 22:05:00) [6]

а ты передаешь саму строку или указатель на неё?
по идее, должно быть так:
str: PChar[255];
readed : integer;
...
ReadFile(hFile, @str, 255, @readed, nil);

а если не работает, то посмотри код ошибки, которую возвращает getLastError();


Наверх

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