Seite 1 von 1

Gibt es eine Alternative zu GetDiskFreeSpace_ ?

Verfasst: 23.03.2006 21:51
von Tracker
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?

Verfasst: 23.03.2006 23:14
von Tracker
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.

Verfasst: 24.03.2006 01:07
von Tracker
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.

Code: Alles auswählen

If OSVersion() <> #PB_OS_Windows_95
   FreeMB      = GetDiskFreeSpace(Left(PackName$,3))
Endif
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?

Verfasst: 24.03.2006 01:19
von Laurin
Packe GetDiskFreeSpace_() in eine DLL.
Da kannst du dann während der Laufzeit entscheiden, ob du sie laden willst oder nicht.

Greetz Laurin

Verfasst: 24.03.2006 03:01
von ts-soft
Du mußt die API dynamisch laden, dann geht es. Skeleton:

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
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 :wink: 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

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)

Verfasst: 24.03.2006 18:42
von Tracker
@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:

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
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 :allright: