Hallo,
ich teste mein Programm gerade unter Windows95/98/ME/NT/2K/XP.
Zum Ermitteln des freien Festplattenplatzes verwende ich die API-Funktion GetDiskFreeSpace_
Sie funktioniert mit allen Betriebssystemen, außer unter Windows95.
Unter Windows95 kann das Programm wegen einem fehlenden Export-KERNEL32.DLL nicht gestartet werden.
Kennt jemand eine Alternative zu GetDiskFreeSpace_ , die auch unter Windows95 funktioniert?
Gibt es eine Alternative zu GetDiskFreeSpace_ ?
- Tracker
- Beiträge: 53
- Registriert: 22.11.2005 21:46
- Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51
Gibt es eine Alternative zu GetDiskFreeSpace_ ?
Ein fehlerfreies Programm ist der Traum jedes Programmierers
- Tracker
- Beiträge: 53
- Registriert: 22.11.2005 21:46
- Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51
Ich habe zu meinem Problem bei Microsoft folgenden Link gefunden:
http://support.microsoft.com/default.as ... us;q231497
Für GetDiskFreeSpace_ benötigt man mindestens Windows 95 OSR2 (Windows95B), das auch FAT32 unterstützt.
Meine Windows95A-Version kennt nur FAT16 (bis 2 GB).
Die Kernel32.dll hat die Version 4.00.950.
Mal sehen, ob es bei Microsoft noch ein Update zum Download gibt, auf das ich verweisen kann.
Wenn ich keinen Ersatz für GetDiskFreeSpace_ finde, benötigt mein 3dgsPurePacker mindestens Windows95B.
http://support.microsoft.com/default.as ... us;q231497
Für GetDiskFreeSpace_ benötigt man mindestens Windows 95 OSR2 (Windows95B), das auch FAT32 unterstützt.
Meine Windows95A-Version kennt nur FAT16 (bis 2 GB).
Die Kernel32.dll hat die Version 4.00.950.
Mal sehen, ob es bei Microsoft noch ein Update zum Download gibt, auf das ich verweisen kann.
Wenn ich keinen Ersatz für GetDiskFreeSpace_ finde, benötigt mein 3dgsPurePacker mindestens Windows95B.
Ein fehlerfreies Programm ist der Traum jedes Programmierers
- Tracker
- Beiträge: 53
- Registriert: 22.11.2005 21:46
- Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51
Ich habe leider kein Update für Windows95 gefunden, mit dem die API-Funktion GetDiskFreeSpace_ funktioniert.
Ich binde die Funktion mit einer Include-Datei ein und rufe sie später einmal im Programm auf.
Wenn es wenigstens eine Möglichkeit gäbe, das Programm so anzupassen, dass die die Funktion unter Windows 95 nicht benutzt wird, z.B.Das klappt aber nicht, weil das Programm unter Windows95 sofort abstürzt, wenn die Include-Datei eingebunden wird und das geschieht beim Compilieren und nicht zur Laufzeit.
Es wäre schade, wenn ich auf GetDiskFreeSpace_ komplett verzichten müsste, nur weil das Programm damit unter Windows95 nicht läuft.
Zwei verschiedene Versionen (eine für Windows 95 und eine zweite für Windows98/ME/NT/2K/XP) will ich aber auch nicht in Umlauf bringen.
hat irgend jemand noch eine Idee?
Ich binde die Funktion mit einer Include-Datei ein und rufe sie später einmal im Programm auf.
Wenn es wenigstens eine Möglichkeit gäbe, das Programm so anzupassen, dass die die Funktion unter Windows 95 nicht benutzt wird, z.B.
Code: Alles auswählen
If OSVersion() <> #PB_OS_Windows_95
FreeMB = GetDiskFreeSpace(Left(PackName$,3))
Endif
Es wäre schade, wenn ich auf GetDiskFreeSpace_ komplett verzichten müsste, nur weil das Programm damit unter Windows95 nicht läuft.
Zwei verschiedene Versionen (eine für Windows 95 und eine zweite für Windows98/ME/NT/2K/XP) will ich aber auch nicht in Umlauf bringen.
hat irgend jemand noch eine Idee?
Ein fehlerfreies Programm ist der Traum jedes Programmierers
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Du mußt die API dynamisch laden, dann geht es. Skeleton:
Bei statischem Binden der API gibts in Win95 natürlich Fehler, bei dynamischen Laden passiert dies nicht.
Nachtrag: Besser wäre es "GetDiskFreeSpaceExA" mit Quadvariablen zu
nutzen
falls Du PB4 nutzt
Es wäre auch besser auf Win95A zu prüfen, da die nachfolgenden Versionen ja funktionieren. Hab leider kein Win95A zur Verfügung, aber die Infos erhälste folgendermassen:
Code: Alles auswählen
If OSVersion() <> #PB_OS_Windows_95
DLL = OpenLibrary(#PB_Any, "Kernel32")
If DLL
CallFunction(DLL, "GetDiskFreeSpaceA", @Drive, @SectorsPerCluster.l, @BytesPerSector.l, @NumberOfFreeClusters.l, @TotalNumberOfClusters.l)
; weiterer Code
CloseLibrary(DLL)
EndIf
EndIf
Nachtrag: Besser wäre es "GetDiskFreeSpaceExA" mit Quadvariablen zu
nutzen

Es wäre auch besser auf Win95A zu prüfen, da die nachfolgenden Versionen ja funktionieren. Hab leider kein Win95A zur Verfügung, aber die Infos erhälste folgendermassen:
Code: Alles auswählen
OS.OSVERSIONINFO
OS\dwOSVersionInfoSize = SizeOf(OSVERSIONINFO)
If GetVersionEx_(@OS) = #False : Debug "Fehler" : End : EndIf
Debug OS\dwMajorVersion
Debug OS\dwMinorVersion
Debug OS\dwBuildNumber
Debug OS\dwPlatformId
Debug PeekS(@OS\szCSDVersion)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Tracker
- Beiträge: 53
- Registriert: 22.11.2005 21:46
- Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51
@Laurin
Danke für den Tipp, aber mein 3dgsPurePacker soll eine Standalone-Exe-Datei werden, die keine externen DLL-Dateien benötigt oder Registry-Daten verändert. Als Basis verwende ich Mischas geniale PackerEX-Include-Datei und ansonsten meist Quelltexte dem PureArea-Codearchiv oder Codefragmente aus dem deutschen oder englischen PureBasic-Forum. Mein 3dgsPurePacker kann ohne Installation sofort gestartet und verwendet werden. Deutsche und englische CHM-Hilfedateien werde ich noch erstellen, die werden für die reine Funktion aber nicht benötigt.
@ts-soft
Dein Tipp mit dem dynamischen Laden der API, hat mein Probem gelöst
Ich kann jetzt zwar unter Windows95 immer noch nicht den freien Plattenplatz berechnen, aber das Programm kann jetzt auch wieder unter Windows95 gestartet werden.
Normalerweise ermittelt der 3dgsPurePacker den benötigten Plattenplatz und packt die Daten nur, wenn genügend freier Speicherplatz verfügbar ist. Diese Sicherheitsabfrage funktioniert unter Windows95 leider nicht.
Hier muss der Anwender sicherstellen, dass auf Festplatte, Diskette oder USB-Stick die Daten gepackt werden können.
Ich habe mir aus der GetDiskFreeSpace.pb (PureArea-Codearchiv) und deinem Beispiel zum dynamischen Laden der API folgende Funktion GetDiskFreeSpaceDynamic() gebastelt, die ich per Include-Befehl in mein Programm einbinde:
Diese Funktion gibt unter allen Windows95 den Fehlercode -1 zurück, auf den ich dann ersprechend reagieren kann oder eben den freien Plattenplatz in MB.
Besitzer von Windows 95 B kommen so natürlich auch nicht in den Genuss einer korrekten Sicherheitsabfrage.
Ich könnte mit deinem zweiten Codebeispiel die Funktion noch entsprechend erweitern, habe aber kein Windows 95 B und kann so auch nicht testen, ob dies funktionieren würde.
Ich glaube auch nicht, dass es noch viele Windows95-Anwender gibt, aber so haben sie wenigstens die Möglichkeit den 3dgsPurePacker zu verwenden.
PureBasic 4 verwende ich noch nicht.
Meinen 3dgsPurePacker werde ich mit der PureBasic-Version 3.94 fertigstellen.
Danke, du hast mir wieder sehr geholfen
Danke für den Tipp, aber mein 3dgsPurePacker soll eine Standalone-Exe-Datei werden, die keine externen DLL-Dateien benötigt oder Registry-Daten verändert. Als Basis verwende ich Mischas geniale PackerEX-Include-Datei und ansonsten meist Quelltexte dem PureArea-Codearchiv oder Codefragmente aus dem deutschen oder englischen PureBasic-Forum. Mein 3dgsPurePacker kann ohne Installation sofort gestartet und verwendet werden. Deutsche und englische CHM-Hilfedateien werde ich noch erstellen, die werden für die reine Funktion aber nicht benötigt.
@ts-soft
Dein Tipp mit dem dynamischen Laden der API, hat mein Probem gelöst

Ich kann jetzt zwar unter Windows95 immer noch nicht den freien Plattenplatz berechnen, aber das Programm kann jetzt auch wieder unter Windows95 gestartet werden.
Normalerweise ermittelt der 3dgsPurePacker den benötigten Plattenplatz und packt die Daten nur, wenn genügend freier Speicherplatz verfügbar ist. Diese Sicherheitsabfrage funktioniert unter Windows95 leider nicht.
Hier muss der Anwender sicherstellen, dass auf Festplatte, Diskette oder USB-Stick die Daten gepackt werden können.
Ich habe mir aus der GetDiskFreeSpace.pb (PureArea-Codearchiv) und deinem Beispiel zum dynamischen Laden der API folgende Funktion GetDiskFreeSpaceDynamic() gebastelt, die ich per Include-Befehl in mein Programm einbinde:
Code: Alles auswählen
;--- GetDiskFreeSpaceDynamic.pbi ---
; ProcedureReturn = FreeMB ;==> OK
; ProcedureReturn = -1 ;==> GetDiskFreeSpaceExA not available under Win95A
Procedure.l GetDiskFreeSpaceDynamic(Drive$)
Structure int64
Long1.l
Long2.l
EndStructure
FreeMB.l = -1
If OSVersion() <> #PB_OS_Windows_95
DLL = OpenLibrary(#PB_Any, "Kernel32")
If DLL
SetErrorMode_(#SEM_FAILCRITICALERRORS)
CallFunction(DLL, "GetDiskFreeSpaceExA", @drive$, BytesFreeToCaller.int64, TotalBytes.int64, TotalFreeBytes.int64)
SetErrorMode_(0)
CloseLibrary(DLL)
EndIf
; calculate sizes in mb.
; TotalMB = ((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12)
FreeMB = ((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12)
EndIf
ProcedureReturn FreeMB
EndProcedure
; Drive$ = "C:\"
; FreeMB.l = 0
; FreeMB =GetDiskFreeSpaceDynamic(Drive$)
; If FreeMB = -1
; MessageRequester (" Error", "GetDiskFreeSpaceExA not available under Win95A",0)
; Else
; MessageRequester (" OK", "Free: " + Str(FreeMB) + " MB")
; EndIf
Besitzer von Windows 95 B kommen so natürlich auch nicht in den Genuss einer korrekten Sicherheitsabfrage.
Ich könnte mit deinem zweiten Codebeispiel die Funktion noch entsprechend erweitern, habe aber kein Windows 95 B und kann so auch nicht testen, ob dies funktionieren würde.
Ich glaube auch nicht, dass es noch viele Windows95-Anwender gibt, aber so haben sie wenigstens die Möglichkeit den 3dgsPurePacker zu verwenden.
PureBasic 4 verwende ich noch nicht.
Meinen 3dgsPurePacker werde ich mit der PureBasic-Version 3.94 fertigstellen.
Danke, du hast mir wieder sehr geholfen

Ein fehlerfreies Programm ist der Traum jedes Programmierers