Delphi2010でのディスク容量の取得方法


VRS  2009-12-11 02:40:12  No: 36405

Delphi2010でディスク容量を取得したいのですが、
読み取り違反が発生してしまいます。

原因がどこにあるのかわからず、お手上げです。
よろしくお願いいたします。

var
  int64FreeAvailable,int64TotalSpace : int64;
  plintTtalFree : PLargeInteger;
begin
  GetDiskFreeSpaceEx(Pchar('C:\'),int64FreeAvailable,int64TotalSpace,plintTtalFree);
  Showmessage(IntToStr(int64TotalSpace));
end;


VRS  2009-12-11 02:41:33  No: 36406

書き忘れていました。
使用OSはWindows2000とXpです。


jazzin  2009-12-11 03:38:46  No: 36407

plintTtalFreeの宣言をTLargeIntegerとし、GetDiskFreeSpaceExに渡すときに
@plintTtalFreeと、変数の前に@をつけてください。それで通ると思います。

PLargeIntegerはTLargeIntegerのポインタです。
ポインタはあくまでもTLargeIntegerがどこにあるかを指し示すものに過ぎません。
実際にある家の中にあなたが入ることはできても、存在しない家の場所を示す住所にあなたが入ることはできませんよね?
今回エラーが発生したのはどこも指し示していないポインタを渡したからです。
@記号は変数のポインタを取得する演算子ですので、
まずvar部分で家を定義し、@で家の住所を取得することでうまくいくと思います。
もしくはNewで確保する方法もありますが、それについてはご自分で検索などして下さい。

なお、plintTtalFreeに返ってくる値が不要な場合は、そこにnilを指定することで省略もできます。


入れ物はどこ?  2009-12-11 03:44:03  No: 36408

lpTotalNumberOfFreeBytes
----
ULARGE_INTEGER 型の変数へのポインタを指定します。この構造体に、ディスクの空き容量が格納されます。
この情報が不要であれば、NULL を指定できます。

ポインタ変数ではなくて「変数へのポインタ」が要求されているのだから
ちゃんと変数を用意してそれへのポインタを渡さなくてはいけません。

var intTotalFree: ULARGE_INTEGER; // Pは付かないよ
...
GetDiskFreeSpaceEx(..., @intTotalFree);

もっとも、コードを見る限りこの情報は不要なようですから
説明されている通り、nilにしておけばいいのでは?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加