Ich hantiere zwar erst seit knapp 2 Monaten mit PureBasic, so daß der Begriff 'Beispiel-Code' wohl nicht ganz zutrifft, aber bei mir funktionier folgender Code sowohl unter Win7 64-Bit als auch unter WinXP 32-Bit:
Die Include-Datei 'MyMemoryInfo.pbi':
Code: Alles auswählen
;***********************************************************************************************************************
;* Die 64-Bit-Versionen der neueren Microsoft Betriebssysteme können mehr Arbeitsspeicher unterstützen als die 32 Bit *
;* Versionen, so daß Long-Werte zur Darstellung der Speichergrößen nicht mehr ausreichen. Die neuere API-Funktion *
;* 'GlobalMemoryStatusEx" speichert diese Daten daher in einer neuen Struktur MEMORYSTATUSEX. Dieser Code zeigt, wie *
;* man diese Funktion in PureBasic 4.50 verwendet. Diese Include-Datei funktioniert sowohl als 32 Bit als auch als *
;* 64 Bit Compilat. Getestet wurde mit Windows XP 32 Bit und Windows 7 64 Bit. *
;* ------------------------------------------------------------------------------------------------------------------- *
;* Umgeschrieben für PureBasic 4.50: Jürgen Priess, 09.2010 *
;***********************************************************************************************************************
EnableExplicit
#Byte = 1 ;Byte
#KB = 1024 ;KiloByte (1024 Byte = 1 KB)
#MB = 1048576 ;MegaByte (1024 KB = 1 MB)
#GB = 1073741824 ;GigaByte (1024 MB = 1 GB)
#TB = 1099511627776 ;TeraByte (1024 GB = 1 TB)
;In API-Funktion 'GlobalMemoryStatusEx' verwendete MEMORY_STATUS_EX-Struktur
Structure MEMORY_STATUS_EX
Length.l ;64 (muß vor aufruf von GlobalMemoryStatusEx initialisiert werden)
MemoryLoad.l ;Belegter Speicher in Prozent vom Gesamt-Speichers
TotalPhys.q ;Gesamter physikalischer Speicher in Byte
AvailPhys.q ;Freier physikalischer Speicher in Byte
TotalPageFile.q ;Gesamtgröße der Auslagerungsdatei in Byte
AvailPagefile.q ;Freier Speicher der Auslagerungsdatei in Byte
TotalVirtual.q ;Gesamtgröße des virtuellen User-Speichers in Byte
AvailVirtual.q ;Freier virtueller User-Speicher in Byte
AvailExtendedVirtual.q ;Ferfügbarer erweiterter virtueller Speicher in Byte (?)
EndStructure
Global MyMemoryStatusEx.MEMORY_STATUS_EX
Global *MyMemoryStatusEx = @MyMemoryStatusEx
Procedure GlobalMemoryStatusEx()
;***********************************************************************************************************************
;* Die Prozedur läd eine vorher initialisierte Struktur mit Informationen zur Speicherbelegung *
;* ------------------------------------------------------------------------------------------------------------------- *
;* Wichtig: Das Length-Feld ist vor dem Aufruf der API-Funktion mit 64 zu initialisieren. *
;***********************************************************************************************************************
MyMemoryStatusEx\Length = SizeOf(MEMORY_STATUS_EX) ;Initialisieren der Längenangabe
GlobalMemoryStatusEx_(*MyMemoryStatusEx) ;Aufruf der API-Funktion aus der KERNEL32.DLL
EndProcedure
Procedure.s BytesUmrechnung(Bytes.q,AusgabeSpeicherEinheit.l=#MB,DezimalStellen=2)
;***********************************************************************************************************************
;* Rechnet die Angegebenen Bytes in die vorgegebene Speichereinheit (#Byte, #KB, #MB, #GB oder #TB) um und gibt das *
;* Ergebnis als String mit den vorgegebenen Dezimalstellen aus (gegebenenfalls gerundet). *
;* ------------------------------------------------------------------------------------------------------------------- *
;* Parameter: Byts: Umzurechnende Anzahl Bytes *
;* AusgabeSpeicherEinheit: Einer der Konstanten: #Byte, #KB, #MB, #GM oder #TB *
;* DezimalStellen: Anzahl der Nachkomma-Stellen *
;* ------------------------------------------------------------------------------------------------------------------- *
;* Return: Umrechnungs-Ergebnis als Dezimal-Zahl mit den vorgegebenen Dezimal-Stellen als String. *
;***********************************************************************************************************************
ProcedureReturn StrD((Bytes/AusgabeSpeicherEinheit),DezimalStellen)
EndProcedure
Code: Alles auswählen
;***********************************************************************************************************************
;* Programm zum Testen der Include-Datei 'MyMemoryInfo.pbi'. *
;* ------------------------------------------------------------------------------------------------------------------- *
;* Geschrieben für PureBasic 4.50 von: Jürgen Priess (09.2010) *
;***********************************************************************************************************************
EnableExplicit
IncludeFile "MyMemoryInfo.pbi"
GlobalMemoryStatusEx()
If OpenConsole()
ConsoleTitle("MyMemoryInfoTest")
PrintN("Der Speicher ist zu " + Str(MyMemoryStatusEx\MemoryLoad) + "% belegt.")
PrintN("Es sind insgesamt " + BytesUmrechnung(MyMemoryStatusEx\TotalPhys,#MB) + " MB physikalischer Speicher eingebaut.")
PrintN("Davon sind noch " + BytesUmrechnung(MyMemoryStatusEx\AvailPhys,#MB) + " MB physikalischer Speicher frei.")
PrintN("Die Auslagerungsdatei hat eine Gesamtgroesse von " + BytesUmrechnung(MyMemoryStatusEx\TotalPageFile,#MB) + " MB.")
PrintN("Davon sind noch " + BytesUmrechnung(MyMemoryStatusEx\AvailPagefile,#MB) + " MB in der Auslagerungsdatei frei.")
PrintN("Der vom Betriebssystem bereit gestellte virtuelle Adressraum ist " + BytesUmrechnung(MyMemoryStatusEx\TotalVirtual,#MB) + " MB.")
PrintN("Davon sind im virtuellen Adressraum noch " + BytesUmrechnung(MyMemoryStatusEx\AvailVirtual,#MB) + " MB frei.")
PrintN("Der erweiterte virtuelle Speicher ist " + BytesUmrechnung(MyMemoryStatusEx\AvailExtendedVirtual,#MB,0) + " MB gross.")
PrintN("")
PrintN("===> Druecken sie Return zum Beenden.")
Input()
CloseConsole()
EndIf
End
__________________________________________________
Doppel-Thread gelöscht und Code-Tags hinzugefügt
23.09.2010
RSBasic