API中的LARGE_INTEGER 在delphi中是什么类型??

sanren2000 2006-06-08 04:15:38
BOOL GetDiskFreeSpaceEx(

LPCTSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailableToCaller,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
我用INT64,LONGINT提示最后一个参数无法转换成LARGE_INTEGER 。。请问应该用什么类型??
...全文
474 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanren2000 2006-06-09
  • 打赏
  • 举报
回复
谢谢 ......
wudi_1982 2006-06-09
  • 打赏
  • 举报
回复
sce1 // 每个簇有多少个扇区
byt1 // 每个扇区多少个字节
cl1 // 空余多少个簇
cl2 // 总共多少个簇
--------------------------------------
昨天晚上给你弄的,完整代码,D7,WINXP下测试通过,可以得到正确的结果。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
function XAddY(x : string;y:string) : string;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var DriveString:String;
sec1, byt1, cl1, cl2: LongWord;
Disk_FreeSpace : real;

begin
GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);
Disk_FreeSpace := (cl1 / (1024*1024*1024))*sec1*byt1;
showmessage(format('该驱动器容量是%0.3fG',[Disk_FreeSpace]));
end;

function TForm1.XAddY(x, y: string): string;
var
a,b,c:array[1..1000] of integer;
i,j,k,l,m,code:integer;
s,p,r:string;
begin
s := x; //两个要相乘的字符串
p := y;
l:=length(s);
for i:=l downto 1 do
Val(s[i],a[l-i+1],code);
m:=length(p);
for i:=m downto 1 do
Val(p[i],b[m-i+1],code);
for j:=1 to m do
for i:=1 to l do
begin
if c[i+j-1]+a[i]*b[j]<=9 then begin
c[j+i-1]:=c[i+j-1]+a[i]*b[j];
k:=i+j-1;
end else begin
c[j+i-1]:=c[i+j-1]+(a[i]*b[j]) mod 10;
c[j+i]:=c[j+i]+ c[j+i-1] div 10+ (a[i]*b[j]) div 10;
c[i+j-1]:=c[i+j-1] mod 10;
k:=i+j;
end;
end;
r := '';
for i:=k downto 1 do
r := r+IntToStr(c[i]);
Result := r;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
sec1, byt1, cl1, cl2: LongWord;
Disk_FreeSpace : string;

begin
GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);
Disk_FreeSpace := XAddY(inttostr(cl1),inttostr(sec1*byt1));
showmessage(format('该驱动器容量是%s字节',[Disk_FreeSpace]));
end;

end.
sanren2000 2006-06-09
  • 打赏
  • 举报
回复
可我没想明白Sec1,Byt1是什么意思??为什么要乘这两个参数呢?
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
现在可以确定了,取的时候没有问题,你用下面的代码取,不计算
procedure TForm1.Button1Click(Sender: TObject);
var DriveString:String;
sec1, byt1, cl1, cl2: LongWord;

begin
GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);
Disk_FreeSpace:=cl1*Sec1*Byt1;
Label1.Caption := '该驱动器总共容量' + Formatfloat('###,##0',cl1) + '字节';
Label2.Caption := '该驱动器可用容量' + Formatfloat('###,##0',sec1) + '字节';
Label3.Caption := '该驱动器总共容量' + Formatfloat('###,##0',byt1) + '字节';
end;
取出来的数据,你用计算器计算,可以得到正确结果。现在的问题,应该就是这个“大数相乘了”
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
刚才给你试了一下,取的时候,没有问题,关键是最后计算的时候。
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
你看看它的声明,就知道每个参数位置代表什么了,
BOOL GetDiskFreeSpace(

LPCTSTR lpRootPathName, // address of root path
LPDWORD lpSectorsPerCluster, // address of sectors per cluster
LPDWORD lpBytesPerSector, // address of bytes per sector
LPDWORD lpNumberOfFreeClusters, // address of number of free clusters
LPDWORD lpTotalNumberOfClusters // address of total number of clusters
);

最后那点乘的位置可能有错,可以这样试验一下
procedure TForm1.Button1Click(Sender: TObject);
var DriveString:String;
sec1, byt1, cl1, cl2: LongWord;
Disk_FreeSpace : int64;//这里用int64试试

begin


GetDiskFreeSpace('c:\', sec1, byt1, cl1, cl2);
Disk_FreeSpace:=cl1*Sec1*Byt1;



end;
sanren2000 2006-06-08
  • 打赏
  • 举报
回复
楼上高手,cl1 := cl1 * sec1 * byt1;能详细解释一下这句吗???cl1在不乘后面的数是不会超出范围的,,byt1应该是比特把???那sec1表示什么意思??cl1最原始的单位应该是什么呢???在没有乘后面两个数值之前的单位应该是什么呢??
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
delphi对它的定义如下。。给你弄弄。。
ULARGE_INTEGER = record
case Integer of
0: (
LowPart: DWORD;
HighPart: DWORD);
1: (
QuadPart: LONGLONG);
end;
{$EXTERNALSYM ULARGE_INTEGER}
PULargeInteger = ^TULargeInteger;
TULargeInteger = ULARGE_INTEGER;
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
看来只有通过
typedef union _ULARGE_INTEGER {

struct {

DWORD LowPart;

DWORD HighPart;

};

ULONGLONG QuadPart;

} ULARGE_INTEGER, *PULARGE_INTEGER;
这个东西下手了
sanren2000 2006-06-08
  • 打赏
  • 举报
回复
TO:wudi_1982 这个我也有,不过总的容量还是不对,,10G以上返回的字节数超出longword的范围。。。。
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
这个可以执行,D7,WINXP测试通过,刚弄的
procedure TForm1.Button1Click(Sender: TObject);
var
driver:pchar;
sec1, byt1, cl1, cl2:longword;
begin
driver:='c:\';//要显示的驱动器名
GetDiskFreeSpace(driver, sec1, byt1, cl1, cl2);
cl1 := cl1 * sec1 * byt1;
cl2 := cl2 * sec1 * byt1;
Label1.Caption := '该驱动器总共容量' + Formatfloat('###,##0',cl2) + '字节';
Label2.Caption := '该驱动器可用容量' + Formatfloat('###,##0',cl1) + '字节';
end;
sanren2000 2006-06-08
  • 打赏
  • 举报
回复
对,现在硬盘空间肯定是大于2G的呀,,请问怎么实现??
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
把integer改成longword;
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
你说的那个例子是不是“获得大于2G硬盘的容量”
sanren2000 2006-06-08
  • 打赏
  • 举报
回复
TO:wudi_1982 这个例子我也见到过,,运行结果有问题,总空间容量是错误的。返回的容量不对。。
sanren2000 2006-06-08
  • 打赏
  • 举报
回复
我用integer 也不行呀??范围太小拉,
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
PULARGE_INTEGER为64位整数类型,其结构定义如下:

typedef union _ULARGE_INTEGER {

struct {

DWORD LowPart;

DWORD HighPart;

};

ULONGLONG QuadPart;

} ULARGE_INTEGER, *PULARGE_INTEGER;

其中,LowPart指定低32位;HighPart指定高32位;QuadPart指定64位。

ULARGE_INTEGER结构是一个联合,如果用户的编译器支持64位整数,用成员QuadPart存储64位整数;否则,用LowPart和HighPart来存储这64位整数。
deansroom 2006-06-08
  • 打赏
  • 举报
回复
vb的定义
Type LARGE_INTEGER ' 8 Bytes
lowpart As Long
highpart As Long
End Type
说明
This structure represents a 64-bit integer. The lowpart field is the lower 32 bits of the integer and the highpart field is the upper 32 bits of the integer.
找来的结论 应该是一个记录类型了 试试record
wudi_1982 2006-06-08
  • 打赏
  • 举报
回复
就用integer,给你个使用的例子
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar;
var lpFreeBytesAvailableToCaller : Integer;
var lpTotalNumberOfBytes: Integer;
var lpTotalNumberOfFreeBytes: Integer) : bool;
stdcall;
external kernel32
name 'GetDiskFreeSpaceExA';


procedure GetDiskSizeAvail(TheDrive : PChar;
var TotalBytes : double;
var TotalFree : double);
var
AvailToCall : integer;
TheSize : integer;
FreeAvail : integer;
begin
GetDiskFreeSpaceEx(TheDrive,
AvailToCall,
TheSize,
FreeAvail);
{$IFOPT Q+}
{$DEFINE TURNOVERFLOWON}
{$Q-}
{$ENDIF}
if TheSize >= 0 then
TotalBytes := TheSize else
if TheSize = -1 then begin
TotalBytes := $7FFFFFFF;
TotalBytes := TotalBytes * 2;
TotalBytes := TotalBytes + 1;
end else
begin
TotalBytes := $7FFFFFFF;
TotalBytes := TotalBytes + abs($7FFFFFFF - TheSize);
end;

if AvailToCall >= 0 then
TotalFree := AvailToCall else
if AvailToCall = -1 then begin
TotalFree := $7FFFFFFF;
TotalFree := TotalFree * 2;
TotalFree := TotalFree + 1;
end else
begin
TotalFree := $7FFFFFFF;
TotalFree := TotalFree + abs($7FFFFFFF - AvailToCall);
end;
end;

deansroom 2006-06-08
  • 打赏
  • 举报
回复
路过 不明白 支持

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧