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

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

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

type

pDIOCRegs = ATDIOCRegs;

TDIOCRegs = packed record

ГЕВХ,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 0 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', ' В ' ] ) ;
regs.rEAX := $2 01;
// код операции read sector regs.rEBX := DWORD(buffer);
// buffer regs.rECX := Track * $100 + Sector;
regs.rFlags := $0;
Result := DeviceloControl(hDevice,VWIN32_DIOC_DOS_INT13, Oregs, sizeof(regs), Sregs, sizeof(regs), nb, nil) and ((regs.rFlags and $1)=0);
CloseHandle(hDevice);

end {win95/98} else

begin // Windows NT/2 000 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 (Юеу1се = INVALI D_HAN DLE_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;
nNutrfcerOfl^esTtoRead: ШОРТ);
var lpNumberOfBytesRead: EWDRD;
lpOverlappsd: POverlapped) : BOOL;
function WriteFile (hFile: THandle;
const Buffer;
nNumberOfBytesToWrite: EWDRD;
var lpNumberOfBytesWritten: EWDRD;
lpOverlapped: FOverlapped) : BOOL;

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

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


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Октябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс