Italia
C ++ Foro

Problem mit DiskFree/DiskSize & GetDiskFreeSpace

 

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
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
28.08.2006  
 




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
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
28.08.2006  
 




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

2.777 kB
Hochgeladen:29.08.2006
Downloadcounter51
Download
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
29.08.2006  
 




Michael
Dell
Hallo Sebastian,

corre Prima!!! Danke
 
Salu Michael...

Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! 
30.08.2006  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

2.323 Views

Untitledvor 0 min.

Themeninformationen

Dieses Thema hat 2 subscriber:

Sebastian König (3x)
Michael Dell (3x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie