2011-12-14 14 views
4

私はLazarusプログラミングフォーラムhow to open a physical diskで質問しました。 「ディスクの選択」ボタンをクリックすると、システムから物理ディスクを選択できるようにしたい。 Stack Overflowには、類似しているが全く同じではない例がいくつかあります(Delphi - Using DeviceIoControl passing IOCTL_DISK_GET_LENGTH_INFO to get flash media physical size (Not Partition)など)。CreateFileを使用して物理ディスクにアクセスするにはどうすればよいですか?

ありCreateFilein the documentation特にan example of calling DeviceIoControl)を使用するCおよびC++の例はたくさんあるが、私はフリーPascalやデルファイのための任意のを見つけることができないと私はそれを行う方法を動作するようにはまだ十分ではないです。

誰かが、デルファイやフリーパスカルで書かれた実際の例を説明するリンクの方向に私を指摘できますか?誰でも私がそれを使用する方法を理解するのを助けることができますか?

+0

重複の種類:http://stackoverflow.com/questions/7826683/how-to-read-raw-block-from-an-usb-storage-device-with-delphi(これにはUSB、ここではUSBは重要な要素ではありませんが、どのディスクにも同じ手法でアクセスしています) –

答えて

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 

は、構文を変更するだけです:

// 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); 

const wszDrive = '\\.\PhysicalDrive0'; 

var pdg: DISK_GEOMETRY; 

ZeroMemory(@pdg, SizeOf(pdg)); 
bResult := GetDriveGeometry(wszDrive, @pdg); 

デルファイ型を持たない文字列定数は、そう、彼らは状況にする必要がどのようなタイプに自動的にあり私たちはCのようにプレフィックスLを必要としません。バックスラッシュはDelphiでは特別なものではないため、エスケープする必要はありません。 Delphiでは、宣言にローカル変数を初期化することはできません。したがって、ZeroMemoryを使用してすべてをゼロに設定します。変数へのポインタを取得するには、&の代わりに@を使用します。

+0

これまでのサポートに感謝します。最初のリンクUSBが便利で、変換されたコードは私の理解にも同様に役立ちます。しかし、私の質問で明らかにならなかったことの1つは、自分のプログラムのユーザーがボタンを押したときに、プログラムがオペレーティングシステムに「どのディスクを持っていますか?すべての物理ディスクのリストを返します。ハードコード "\\。\ PHYSICALDISKX"が必要なことをやりたくないのですが、私はプログラムが必要なディスクを見つけ出してユーザーが選択できるようにする必要があります。そこから、\\。\ PHYSICALDISKXに変換することができます。 –

+2

はい、それは理にかなっていますが、それはあなたが尋ねたものではありません。物理ディスクのリストを取得することは、CreateFileを呼び出す方法とはまったく関係ありません。あなたが[そのようなリストを取得する方法](http://stackoverflow.com/search?q=list+of+physical+disks)を把握できない場合は、Stack Overflowで新しい質問を投稿してください。 –

+0

+1。いい説明、ロブ。 –

関連する問題