Sumitro Chowdhury wrote:
> I am real confused by the 64 bit math when using the prototype model of
> Win32::API.
>
> Reference :
> http://aspn.activestate.com/ASPN/Mail/Message/200335
> http://aspn.activestate.com/ASPN/Mail/Message/206605
> http://aspn.activestate.com/ASPN/Mail/Message/206599
>
>
> Here is what I am trying for implementing GetDiskFreeSpaceEx :
> ( Using Win32::API->Import ).
...
>
> I get :
> Got back FreeBytesAvailable as 1843236864
> Got back TotalNumberOfBytes as 1388666880
> Got back TotalNumberOfFreeBytes as 1843236864
> FreeBytesAvailable converts as 3772304584.80006
> TotalNumberOfBytes converts as 3772307672.87843
> TotalNumberOfFreeBytes converts as 3772304584.80006
>
> While C:\ has 10,433,171,456 bytes free.
Try this (I'm not bothering with a conversion routine, but I would
just multiple high by 2**32 and add low - you'll be forced to use
a float to handle it - the struct I'm using does the unpack 'L' for
you) :
use strict;
use warnings;
use Win32::API;
# typedef struct _ULARGE_INTEGER { DWORD LowPart; DWORD HighPart; }
ULARGE_INTEGER;
Win32::API::Struct->typedef('ULARGE_INTEGER', qw(
DWORD LowPart;
DWORD HighPart;
));
# BOOL GetDiskFreeSpaceEx(
# LPCTSTR lpDirectoryName,
# PULARGE_INTEGER lpFreeBytesAvailable,
# PULARGE_INTEGER lpTotalNumberOfBytes,
# PULARGE_INTEGER lpTotalNumberOfFreeBytes
# );
Win32::API->Import('Kernel32', 'BOOL GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,
LPULARGE_INTEGER lpFreeBytesAvailable, LPULARGE_INTEGER lpTotalNumberOfBytes,
LPULARGE_INTEGER lpTotalNumberOfFreeBytes)') or
die "Import GetDiskFreeSpaceEx: $^E";
my $lpDirectoryName = pack 'Z*', substr (shift || 'C', 0, 1) . ':\\';
my $lpFreeBytesAvailable = new Win32::API::Struct ('ULARGE_INTEGER');
my $lpTotalNumberOfBytes = new Win32::API::Struct ('ULARGE_INTEGER');
my $lpTotalNumberOfFreeBytes = new Win32::API::Struct ('ULARGE_INTEGER');
if ($debug) {
print Data::Dumper->Dump([$lpDirectoryName], [qw($lpDirectoryName)]);
$lpFreeBytesAvailable->Dump('FreeBytesAvailable');
$lpTotalNumberOfBytes->Dump('TotalNumberOfBytes');
$lpTotalNumberOfFreeBytes->Dump('TotalNumberOfFreeBytes');
}
my $ret = GetDiskFreeSpaceEx ($lpDirectoryName, $lpFreeBytesAvailable,
$lpTotalNumberOfBytes, $lpTotalNumberOfFreeBytes);
print Data::Dumper->Dump([$ret], [qw($ret)]) if $debug;
die "GetDiskFreeSpaceEx: $! ($^E)" if not $ret;
printf "FreeBytesAvailable: %.3f MB (%08x, %08x)\n",
($lpFreeBytesAvailable->{HighPart} * 2**32 +
$lpFreeBytesAvailable->{LowPart}) / (1024*1024),
$lpFreeBytesAvailable->{HighPart}, $lpFreeBytesAvailable->{LowPart};
printf "TotalNumberOfBytes: %.3f MB (%08x, %08x)\n",
($lpTotalNumberOfBytes->{HighPart} * 2**32 +
$lpTotalNumberOfBytes->{LowPart}) / (1024*1024),
$lpTotalNumberOfBytes->{HighPart}, $lpTotalNumberOfBytes->{LowPart};
printf "TotalNumberOfFreeBytes: %.3f MB (%08x, %08x)\n",
($lpTotalNumberOfFreeBytes->{HighPart} * 2**32 +
$lpTotalNumberOfFreeBytes->{LowPart}) / (1024*1024),
$lpTotalNumberOfFreeBytes->{HighPart}, $lpTotalNumberOfFreeBytes->{LowPart};
__END__
--
,-/- __ _ _ $Bill Luebkert Mailto:[EMAIL PROTECTED]
(_/ / ) // // DBE Collectibles Mailto:[EMAIL PROTECTED]
/ ) /--< o // // Castle of Medieval Myth & Magic http://www.todbe.com/
-/-' /___/_<_</_</_ http://dbecoll.tripod.com/ (My Perl/Lakers stuff)
_______________________________________________
Perl-Win32-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs