Visual FoxPro und die DRIVESPACE mit > 2GB LW

Hallo Forum,
es gibt zwar in Visual FoxPro eine Funktion, mit welcher man den aktuellen freien Festplattenspeicher abfragen kann (DRIVSPACE), leider funktioniert diese nur unter NT richtig.
Unter WIN9x wird leider nur max. 2GB angezeigt.
Das Handbuch meint dazu nur: „Bei Netzwerklaufwerken kann die Funktion ungenaue Werte zurückgeben“

Es gibt nun eine WIN32 API Funtion:

>>>

welche genau den richtigen Wert zurückliefern sollte, leider habe ich es noch nicht fertig gebracht, die Fn richtig anzusprechen. -
Ein Demoprogramm in Visual Basic liegt mir vor und dort funktioniert auch unter WIN9x

Wer kann mir helfen?

Hallo,
aus dem API-Guide:

'In general section
Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long

Private Sub Form\_Load()
 'KPD-Team 1998
 'URL: http://www.allapi.net/
 'E-Mail: [email protected]

 Dim Sectors as Long,Bytes as Long,FreeC as Long, TotalC as Long,Total as Long,Freeb as Long
 'Retrieve information about the C:\
 GetDiskFreeSpace "C:\", Sectors, Bytes, Freec, Totalc
 'Set graphic mode to persistent
 Me.AutoRedraw = True
 'Print the information to the form
 Me.Print " Path: C:\"
 Me.Print " Sectors per Cluster:" + Str$(Sector)
 Me.Print " Bytes per sector:" + Str$(Bytes)
 Me.Print " Number Of Free Clusters:" + Str$(Freec)
 Me.Print " Total Number Of Clusters:" + Str$(Totalc)
 Total = rTotalc& \* rSector& \* rBytes&
 Me.Print " Total number of bytes in path:" + Str$(Total)
 Freeb = rFreec& \* rSector& \* rBytes&
 Me.Print " Free bytes:" + Str$(Freeb)
End sub

Gruß

J.

Servus Michael,

leider hab ich überhaupt keine Zeit, es auszuprobieren, aber soweit ich mich erinnern kann, muss man in FoxPro eine API-Funktion zuerst mit der Funktion RegFn registrieren und dann kann man sie erst mit der Funktion CallFn aufrufen, wobei diese beiden genannten Funktionen in der foxtools.fll (nicht dll!) sind … glaub ich …
Vielleicht hilft dir das ein bisschen weiter.

Roland

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ungefähr so sollte es in Visual FoxPro gehen (NICHT GETESTET!):

SET LIBRARY TO foxtools.fll
SET UDFPARMS TO VALUE
LaufWerk = "C:\"
Sektoren = 0
Bytes = 0
FreiC = 0
TotalC = 0
x = REGFN("GetDiskFreeSpaceA","CLLLL","L","d:\winnt\system32\kernel32.dll")
y = CALLFN(x,LaufWerk,Sektoren,Bytes,FreiC,TotalC)
frei = FreiC \* Sektoren \* Bytes
? frei

Hallo Leute,
vielen Dank dass Ihr Euch meines Problem’s angenommen habt! - Ich danke Euch!!!
Ich habe zwischenzeitlich eine Lösung über ein anderes Forum (dFPUG) erhalten und moechte hier die Loeseung nicht vorenthalten:

Local cDirectoryName, FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes
Local cb, bOk, bufFreeBytesAvailable, bufTotalNumberOfBytes, bufTotalNumberOfFreeBytes

* Verzeichnis, von dem die Kapazität geprüft werden soll:
cDirectoryName = „C:“

Declare INTEGER GetDiskFreeSpaceEx IN Kernel32 ;
STRING @ lpDirectoryName, ;
STRING @ lpFreeBytesAvailable, ;
STRING @ lpTotalNumberOfBytes, ;
STRING @ lpTotalNumberOfFreeBytes

* Speicherbereich für die Rückgabe der Datenm, je 8 bytes - LARGE_INTEGER!
bufFreeBytesAvailable=SPACE(8)
bufTotalNumberOfBytes=SPACE(8)
bufTotalNumberOfFreeBytes=SPACE(8)

* API Funktion aufrufen
bOk = GetDiskFreeSpaceEx(@cDirectoryName, ;
@bufFreeBytesAvailable, @bufTotalNumberOfBytes, @bufTotalNumberOfFreeBytes)>0

* wenn ok
If bOk
* Werte in numerische Fox-Varianlen…
cb = bufFreeBytesAvailable

FreeBytesAvailable = ((((((( ;
ASC(SUBSTR(cb,8,1)) ) * 256 + ;
ASC(SUBSTR(cb,7,1)) ) * 256 + ;
ASC(SUBSTR(cb,6,1)) ) * 256 + ;
ASC(SUBSTR(cb,5,1)) ) * 256 + ;
ASC(SUBSTR(cb,4,1)) ) * 256 + ;
ASC(SUBSTR(cb,3,1)) ) * 256 + ;
ASC(SUBSTR(cb,2,1)) ) * 256 + ;
ASC(SUBSTR(cb,1,1))
cb = bufTotalNumberOfFreeBytes
TotalNumberOfFreeBytes = ((((((( ;
ASC(SUBSTR(cb,8,1)) ) * 256 + ;
ASC(SUBSTR(cb,7,1)) ) * 256 + ;
ASC(SUBSTR(cb,6,1)) ) * 256 + ;
ASC(SUBSTR(cb,5,1)) ) * 256 + ;
ASC(SUBSTR(cb,4,1)) ) * 256 + ;
ASC(SUBSTR(cb,3,1)) ) * 256 + ;
ASC(SUBSTR(cb,2,1)) ) * 256 + ;
ASC(SUBSTR(cb,1,1))
cb = bufTotalNumberOfBytes
TotalNumberOfBytes = ((((((( ;
ASC(SUBSTR(cb,8,1)) ) * 256 + ;
ASC(SUBSTR(cb,7,1)) ) * 256 + ;
ASC(SUBSTR(cb,6,1)) ) * 256 + ;
ASC(SUBSTR(cb,5,1)) ) * 256 + ;
ASC(SUBSTR(cb,4,1)) ) * 256 + ;
ASC(SUBSTR(cb,3,1)) ) * 256 + ;
ASC(SUBSTR(cb,2,1)) ) * 256 + ;
ASC(SUBSTR(cb,1,1))

? "Capacity of " + cDirectoryName + ": "
? "FreeBytesAvailable: "
?? FreeBytesAvailable
? "TotalNumberOfBytes: "
?? TotalNumberOfBytes
? "TotalNumberOfFreeBytes: "
?? TotalNumberOfFreeBytes
Return TotalNumberOfFreeBytes
Else
? "Error GetDiskFreeSpaceEx for " + cDirectoryName
Endif

Nochmals: Vielen Dank, den Leuten die Ihr Wissen mit anderen teilen!