4

Lazarus プログラミング フォーラムで、物理ディスクを開く方法を尋ねました。ユーザーが [ディスクの選択] ボタンをクリックしたときに、システムから物理ディスクを選択できるようにしたいと考えています。スタック オーバーフローには、似ているがまったく同じではない例がいくつかあります ( Delphi - Using DeviceIoControl pass IOCTL_DISK_GET_LENGTH_INFO to get flash media physical size (Not Partition) など)。

CreateFileC および C++ の使用例(ドキュメント、特に呼び出しの例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 の型指定されていない文字列定数は、コンテキスト内で必要な型に自動的に変換されるため、LC が使用するような接頭辞は必要ありません。バックスラッシュは Delphi では特別なものではないため、エスケープする必要はありません。Delphi では、宣言でローカル変数を初期化することは許可されていないため、ZeroMemoryすべてをゼロに設定するために使用します。@代わりに使用&して、変数へのポインタを取得します。

于 2011-12-14T15:18:53.537 に答える