Ваш пример C имеет следующий код:
/* LPWSTR wszPath */
hDevice = CreateFileW(wszPath, // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
Преобразование этого вызова функции в Delphi - это всего лишь вопрос изменения синтаксиса:
// wszPath: PWideChar
hDevice := CreateFileW(wszPath,
0,
FILE_SHARE_READ or
FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
То есть используйте :=
для присваивания, or
для объединения битовых флагов, nil
для нулевых указателей и 0
для нулевых файловых дескрипторов.
Функция вызывается так:
#define wszDrive L"\\\\.\\PhysicalDrive0"
DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure
bResult = GetDriveGeometry (wszDrive, &pdg);
Сновапросто измените синтаксис на Delphi:
const wszDrive = '\\.\PhysicalDrive0';
var pdg: DISK_GEOMETRY;
ZeroMemory(@pdg, SizeOf(pdg));
bResult := GetDriveGeometry(wszDrive, @pdg);
Нетипизированные строковые константы Delphi автоматически относятся к любому типу, который им нужен для контекста, поэтому нам не нужен префикс L
, подобный Си.Обратная косая черта не является особенной в Delphi, поэтому их не нужно экранировать.Delphi не позволяет инициализировать локальные переменные в объявлении, поэтому мы используем ZeroMemory
, чтобы установить все на ноль.Используйте @
вместо &
, чтобы получить указатель на переменную.