|
Haben Sie sich schon gefragt, wie Sie mit so genannten "Large
Integer"-Werten in Visual Basic umgehen sollen? Das sind 64-Bit
große Zahlen und sie sind wie folgt definiert:
Type LARGE_INTEGER
lowpart As Long ' Niederwertiger 32-bit-Anteil
highpart As Long ' Höherwertiger 32-bit-Anteil
End Type
Es gibt API-Funktionen, die Wertebereiche bearbeiten, für die
die an sich schon recht großen 32-Bit-Werte (in Visual Basic ist
das der Datentyp Long) nicht mehr ausreichen. So gibt es etwa die
Funktion GetDiskFreeSpaceEx,
die mit heute gebräuchlichen Festplattengrößen zurecht kommen
muss. Die numerischen Parameter dieser Funktion sind dementsprechend
als LARGE_INTEGER deklariert:
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
lpFreeBytesAvailableToCaller As LARGE_INTEGER, _
lpTotalNumberOfBytes As LARGE_INTEGER, _
lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long
Aus den zurück gegebenen Datentypen eine für Menschen lesbare
Zahl zu machen, scheint auf den ersten Blick in mathematische
Fummelei auszuarten. Auf den zweiten Blick gibt es eine einfachere
Lösung. Sie beruht auf dem alten Trick, benutzerdefinierte
Variablen gleicher Byte-Länge einander gleich zu setzen.
Den passenden Datentyp dazu bietet Visual Basic selbst schon an.
Zahlen des Datentyps Currency sind nämlich 64-Bit-Zahlen. Sie
brauchen also nur eine benutzerdefinierte Variable, die ein einziges
Element des Datentyps Currency enthält:
Private Type CurType
CurVal As Currency
End Type
Und schon geht es fast wie von selbst:
Dim LargeInteger as LARGE_INTEGER
Dim Lesbar As Currency
...
LSet Lesbar = LargeInteger
Debug.Print Lesbar.CurVal
Daran, dass laut Visual Basic-Dokumentation Currency-Werte
automatisch 4 Nachkommastellen haben sollen, stört sich unsere
gerade gezeigte "Konvertierung" recht wenig: Sie liefert
ganzzahlige Werte.
Allerdings geht es noch einen Tick einfacher. Sie können
nämlich bereits in der Deklaration der API-Funktion problemlos den
vertrackten LARGE_INTEGER-Typ durch den Datentyp Currency ersetzen:
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
lpFreeBytesAvailableToCaller As Currency, _
lpTotalNumberOfBytes As Currency, _
lpTotalNumberOfFreeBytes As Currency) As Long
Allerdings meint Visual Basic hier denn doch seinen Willen,
sprich vier Nachkommastellen durchsetzen zu müssen. Das braucht Sie
aber nicht weiter zu stören. Multiplizieren Sie die
zurückgegebenen Werte einfach jeweils mit 10.000 - und schon haben
Sie ohne weitere Verrenkungen den gesuchten Plattenplatz als hübsch
ganzzahlige Bytes.
Public Sub GetDiskFreeSpace(Drive As String, _
BytesAvailable As Currency, _
TotalBytes As Currency, _
FreeBytes As Currency)
GetDiskFreeSpaceEx Drive, BytesAvailable, TotalBytes, FreeBytes
BytesAvailable = BytesAvailable * 10000
TotalBytes = TotalBytes * 10000
FreeBytes = FreeBytes * 10000
End Sub
Einen noch schlichteren Aufruf der Funktion GetDiskFreeSpace gibt
es nicht. Mit den zurückgegebenen Currency-Werten können Sie wie
gewohnt hantieren - sie können Sie auch durch jede beliebige
Format-Schablone pressen:
Private Sub Command1_Click()
Dim BytesAvailable As Currency
Dim TotalBytes As Currency
Dim FreeBytes As Currency
GetDiskFreeSpace "C:\", BytesAvailable, TotalBytes, FreeBytes
Debug.Print
Debug.Print "Bytes verfügbar: " & _
Format$(Format$(BytesAvailable, "#,##0"), "@@@@@@@@@@@@@@@")
Debug.Print "Bytes insgesamt: " & _
Format$(Format$(TotalBytes, "#,##0"), "@@@@@@@@@@@@@@@")
Debug.Print "Bytes frei: " & _
Format$(Format$(FreeBytes, "#,##0"), "@@@@@@@@@@@@@@@")
End Sub
|