| |
|
|
Michael Dell | Hallo Sebastian,
hab da ein kleines Problem entdeckt und zwar in allen Versionen von Prf2Cpp. Das ganze betrifft die Funktionen DiskFree/DiskSize sowie die API GetDiskFreeSpaceExA.
DiskFree/DiskSize corre auf WinXP prima aber nicht auf Win98. GetDiskFreeSpaceExA corre auf beiden Systemen nicht. (vermute das es was mit der Byte Funktion zu tun hat.)
Hier ein Demo: KompilierenMarkierenSeparieren!Def GFDS_lwTyp(1) SubStr$(LW_Typ($(1)),2,"> ")
Def GFDS_DskSpaceGesamt(1) Val(SubStr$(SubStr$($(1),2,"|||"),1,"||"))
Def GFDS_DskSpaceFrei(1) Val(SubStr$(SubStr$($(1),2,"|||"),2,"||"))
Def GFDS_DskSpaceBelegt(1) Val(SubStr$(SubStr$($(1),2,"|||"),3,"||"))
Proc ShowIt
Parameters txt$
Print
Print SubStr$(txt$,1,"|||")
Print (" "+Format$("###,##0.00",Round(Div(GFDS_DskSpaceGesamt(txt$),1000000),2))+" Mb gesamt")
Print (" "+Format$("###,##0.00",Round(Div(GFDS_DskSpaceFrei(txt$),1000000),2))+" Mb frei")
Print (" "+Format$("###,##0.00",Round(Div(GFDS_DskSpaceBelegt(txt$),1000000),2))+" Mb belegt")
Print
Print
EndProc
Proc LW_Typ
Parameters LW$
Def LaufwerksTyp(1) !"KERNEL32.DLL","GetDriveTypeA"
Declare LW#,LW_Typ&
Dim LW#,Add(Len(LW$),1)
String LW#,0 = LW$
LW_Typ& = LaufwerksTyp(LW#)
Dispose LW#
Case Equ(LW_Typ&,0): Return LW$+"> keine Ahnung"
Case Equ(LW_Typ&,1): Return LW$+"> nicht vorhanden"
Case Equ(LW_Typ&,2): Return LW$+"> Diskette"
Case Equ(LW_Typ&,3): Return LW$+"> Festplatte"
Case Equ(LW_Typ&,4): Return LW$+"> Netz Laufwerk"
Case Equ(LW_Typ&,5): Return LW$+"> CD/DVD"
Case Equ(LW_Typ&,6): Return LW$+"> RAM"
Return "Fehler!"
EndProc
Proc GetDiskFreeSpace
Parameters gDS_LW$
Declare Gesamt!,Belegt!,gFrei!
Clear Gesamt!,Belegt!,gFrei!
gDS_LW$ = (Left$(gDS_LW$,3) + Chr$(0))
DiskFree(gDS_LW$)
DiskSize(gDS_LW$)
Gesamt! = DiskSize(gDS_LW$)
gFrei! = DiskFree(gDS_LW$)
Belegt! = (Gesamt! - gFrei!)
Return (GFDS_lwTyp(gDS_LW$)+"|||"+ Str$(Gesamt!) + "||" + Str$(gFrei!) + "||" + Str$(Belegt!))
EndProc
Proc old_GetDiskFreeSpace
Parameters Path$
Declare LWtyp$
Def GetDiskFreeSpaceEx(4) !"KERNEL32.DLL","GetDiskFreeSpaceExA"
Def x!(8) (((((((%(8)*256+%(7))*256+%(6))*256+%(5))*256+%(4))*256+%(3))*256+%(2))*256+%(1))
Declare Path#,AvBytes#,TotalBytes#,FreeBytes#,frei!,gesamt!,avb!,erg$
Dim Path#,255
Dim AvBytes#,8
Dim TotalBytes#,8
Dim FreeBytes#,8
String Path#,0 = Path$
GetDiskFreeSpaceEx(Path#,AvBytes#,TotalBytes#,FreeBytes#)
gesamt! = x!(Byte(TotalBytes#,0),Byte(TotalBytes#,1),
Byte(TotalBytes#,2),Byte(TotalBytes#,3),
Byte(TotalBytes#,4),Byte(TotalBytes#,5),
Byte(TotalBytes#,6),Byte(TotalBytes#,7))
frei! = x!(Byte(FreeBytes#,0),Byte(FreeBytes#,1),
Byte(FreeBytes#,2),Byte(FreeBytes#,3),
Byte(FreeBytes#,4),Byte(FreeBytes#,5),
Byte(FreeBytes#,6),Byte(FreeBytes#,7))
avb! = Sub(gesamt!,frei!)
gesamt! = Round(gesamt!,0)
frei! = Round(frei!,0)
avb! = Round(avb!,0)
erg$ = "|||"+Str$(gesamt!)+"||"+Str$(frei!)+"||"+Str$(avb!)
erg$ = GFDS_lwTyp(Path$) + erg$
Dispose AvBytes#
Dispose TotalBytes#
Dispose FreeBytes#
Dispose Path#
Return erg$
EndProc
**** Programm- Source ****
Cls
Print "Mit qDiskFree/DiskSizeq"
ShowIt(GetDiskFreeSpace("C:"))
ShowIt(GetDiskFreeSpace("D:"))
Print "Mit qGetDiskFreeSpaceExAq"
ShowIt(old_GetDiskFreeSpace("C:"))
ShowIt(old_GetDiskFreeSpace("D:"))
WaitInput
End
|
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 28.08.2006 ▲ |
|
|
|
|
Sebastian König | Hallo Michael,
danke per den Hinweis und den Testcode!
Das Problem bei der Variante mit GetDiskFreeSpaceExA() liegt beim Aufruf der Funktion x!(): C++ benutzt dort zur Berechnung keine Fließkomma-Arithmetik sondern einfach Integer. Leider kann man das nicht so einfach ändern, da es sich halt um einen reinen Integer-Ausdruck handelt. Es gibt aber glücklicherweise einen sehr einfachen Workaround : Wenn Du in der DEFinition einfach @!() statt @%() verwendest, sollte es sowohl mit XProfan als auch mit Profan2Cpp richtig funktionieren...
Wegen der Sache mit DiskFree/DiskSize melde ich mich später nochmal
MfG
Sebastian |
|
|
| |
|
|
|
Michael Dell | Danke, das funktioniert
Das ich das schon wieder nicht Geschnallt hab, ich sollte mich wohl mehr konzentrieren. |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 28.08.2006 ▲ |
|
|
|
|
Sebastian König | [quote:1b6b11ce43]Danke, das funktioniert [/quote:1b6b11ce43] Ok, super
Jetzt zu dem anderen Problem: Als Ursache vermute ich, dass ich in meiner Implementierung von DiskFree() nur Danke, das funktioniert GetDiskFreeSpace() benutze. Dazu steht in der Remarks-Sektion im MSDN, dass es unter Win95/98 Probleme mit Laufwerkskapazitäten > 2GB gibt... In der nächsten Beta-Version (die ich wohl morgen hochladen werde) werde ich das mal auf GetDiskFreeSpaceEx() umstellen...
MfG
Sebastian |
|
|
| |
|
|
|
Sebastian König | Hallo Michael,
gerade habe ich Version 1.5.9f hochgeladen (und außerdem an diesen Beitrag angehängt ). Funktionieren @DiskFree() und @DiskSize() damit jetzt auch unter Windows 98 korrekt?
MfG
Sebastian |
|
|
| |
|
|
|
Michael Dell | Hallo Sebastian,
corre Prima!!! Danke |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 30.08.2006 ▲ |
|
|
|