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


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


Функция createFile возвращает дескриптор открытого объекта ввода/вывода. Если открытие невозможно из-за ошибок, возвращается код INVALID_HANDLE_VALUE, а расширенный код ошибки можно узнать, вызвав функцию GetLastError.

Закрывается файл в Win32 функцией closeHandie (не closeFile, a closeHandle! Правда, "легко" запомнить? Что поделать, так их назвали разработчики Win32).

Приведем из большого разнообразия несколько приемов использования функции CreateFile. Часто программисты хотят иметь возможность организовать посекторный доступ к физическим устройствам хранения — например к дискете. Сделать это не так уж сложно, но при этом методы для Windows 98 и Windows 2000 различаются. В Windows 2000 придется открывать устройство ('\\.\A:'), а в Windows 98 — специальный драйвер доступа (обозначается '\\.\vwin32'). И то и другое делается функцией createFile.

 Листинг 9.1  Чтение сектора с дискеты при помощи функции CreateFile 

type

pDIOCRegs = ^TDIOCRegs;

TDIOCRegs = packed record

rEBX,rEDX,rECX,rEAX,rEDI, rESI, rFlags : DWORD;

end;

const VWIN32_DIOC_DOS_IOCTL = 1;

VWIN32_DIOC_DOS_INT13 = 4; //Прерывание 13

SectorSize = 512;

function ReadSector(Head, Track, Sector: Integer; buffer : pointer; 

Floppy: char):Boolean; 

var hDevice : THandle; 

Regs : TDIOCRegs;

 DevName : string; nb : Integer; 

begin

if WIN32PLATFORM <> VER_PLATFORM_WIN32_NT then

 begin {win95/98} hDevice := CreateFile('\\.\vwin32', GENERIC_READ, 0, nil, 0,

FILE_FLAG_DELETE_ON_CLOSE, 0);

if (hDevice = INVALID_HANDLE_VALUE) then

 begin

Result := FALSE;

Exit; end;

regs.rEDX := Head * $100 + Ord(Floppy in ['b', 'B']);

regs.rEAX := $201; // KOH onepam-iM read sector

regs.rEBX := DWORD(buffer); // buffer

regs.rECX := Track * $100 + Sector;

regs.rFlags := $0;

Result := DeviceloControl(hDevice,VWIN32_DIOC_DOS_INT13,

@regs, sizeof(regs), @regs, sizeof(regs), nb, nil) 

and ((regs.rFlags and $1)=0); CloseHandle(hDevice); 


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



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