@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
