4

我在 Lazarus 编程论坛上询问如何打开物理磁盘。我想允许用户在单击“选择磁盘”按钮时从他们的系统中选择物理磁盘。Stack Overflow 上有一些类似但不完全相同的示例(例如Delphi - Using DeviceIoControl passing IOCTL_DISK_GET_LENGTH_INFO to get flash media physical size (Not Partition))。

有很多 C 和 C++ 使用示例CreateFile在文档中,尤其是调用示例DeviceIoControl),但我找不到 Free Pascal 或 Delphi 的任何示例,而且我还不够好,无法弄清楚如何去做。

谁能指出一个链接的方向来解释它,或者更好的是用 Delphi 或 Free Pascal 编写的实际示例?谁能帮我理解如何使用它?

4

1 回答 1

7

您的 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像 C 使用的任何前缀。反斜杠在 Delphi 中并不特殊,因此不需要转义。Delphi 不允许在声明中初始化局部变量,因此我们使用ZeroMemory将所有内容设置为零。使用@而不是&获取指向变量的指针。

于 2011-12-14T15:18:53.537 回答