Delphi2010でディスク容量を取得したいのですが、
読み取り違反が発生してしまいます。
原因がどこにあるのかわからず、お手上げです。
よろしくお願いいたします。
var
int64FreeAvailable,int64TotalSpace : int64;
plintTtalFree : PLargeInteger;
begin
GetDiskFreeSpaceEx(Pchar('C:\'),int64FreeAvailable,int64TotalSpace,plintTtalFree);
Showmessage(IntToStr(int64TotalSpace));
end;
書き忘れていました。
使用OSはWindows2000とXpです。
plintTtalFreeの宣言をTLargeIntegerとし、GetDiskFreeSpaceExに渡すときに
@plintTtalFreeと、変数の前に@をつけてください。それで通ると思います。
PLargeIntegerはTLargeIntegerのポインタです。
ポインタはあくまでもTLargeIntegerがどこにあるかを指し示すものに過ぎません。
実際にある家の中にあなたが入ることはできても、存在しない家の場所を示す住所にあなたが入ることはできませんよね?
今回エラーが発生したのはどこも指し示していないポインタを渡したからです。
@記号は変数のポインタを取得する演算子ですので、
まずvar部分で家を定義し、@で家の住所を取得することでうまくいくと思います。
もしくはNewで確保する方法もありますが、それについてはご自分で検索などして下さい。
なお、plintTtalFreeに返ってくる値が不要な場合は、そこにnilを指定することで省略もできます。
lpTotalNumberOfFreeBytes
----
ULARGE_INTEGER 型の変数へのポインタを指定します。この構造体に、ディスクの空き容量が格納されます。
この情報が不要であれば、NULL を指定できます。
ポインタ変数ではなくて「変数へのポインタ」が要求されているのだから
ちゃんと変数を用意してそれへのポインタを渡さなくてはいけません。
var intTotalFree: ULARGE_INTEGER; // Pは付かないよ
...
GetDiskFreeSpaceEx(..., @intTotalFree);
もっとも、コードを見る限りこの情報は不要なようですから
説明されている通り、nilにしておけばいいのでは?
ツイート | ![]() |