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

Reply via email to