Самоучитель по Delphi 7 для профессионалов


Ввод/вывод с использованием функций Windows API - часть 3


end {win95/98} 

else

begin // Windows NT/2000 

DevName :='\\.\A:';

if Floppy in ['b', 'B'] then DevName[5] := Floppy;

hDevice := CreateFile(pChar(Devname), GENERIC_READ, FILE_SHARE_READ 

or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

if (hDevice = INVALID_HANDLE_VALUE) then 

begin 

Result := FALSE;

Exit;

end;

SetFilePointer(hDevice, (Sector-1)*SectorSize, nil, FILE_BEGIN); // нумерация с 1

Result := ReadFile(hDevice, buffer';, SectorSize, nb, nil) and (nb=SectorSize);

CloseHandle(hDevice);

end; // Windows NT/2000 

end;

Для чтения и записи данных в Win32 используются функции:

function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD; var IpNumberOfBytesRead: DWORD; IpOverlapped: POverlapped): BOOL; function WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD; var IpNumberOfBytesWritten: DWORD; IpOverlapped: POverlapped): BOOL;

Здесь все сходно с BlockRead и Blockwrite: hFile — это дескриптор файла, Buffer — адрес, по которому будут читаться (писаться) данные; третий параметр означает требуемое число читаемых (записываемых) байтов, а четвертый — фактически прочитанное (записанное). Последний параметр — IpOverlapped — обсудим чуть позже.

Функция createFile используется и для доступа к портам ввода/вывода. Часто программисты сталкиваются с задачей: как организовать обмен данными с различными нестандартными устройствами, подключенными к параллельному или последовательному порту? В Turbo Pascal для DOS был очень хороший псевдомассив Ports: пишешь Port[x] := у; и не знаешь проблем. В Win32 прямой доступ к портам запрещен и приходится открывать их как файлы:

...

hCom := CreateFile('COM2', GENERIC_READ or GENERIC_WRITE,

0, NIL, OPEN_EXISTING, FILE_FLAG__OVERLAPPED, 0) ;

 if hCom = INVALID_HANDLE_VALUE then

begin

raise EAbort.CreateFmt('Ошибка открытия порта: %d*,[GetLastError]);

end;

Самое большое отличие от предыдущего примера — в скромном флаге FILE_FLAG_OVERLAPPED. О роли этих изменений- в следующем разделе

 




Начало  Назад  Вперед



Книжный магазин