ULarge Integer [WinApi] ~gelöst~

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Marek

Betreff: ULarge Integer [WinApi] ~gelöst~

BeitragMi, Jul 09, 2008 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin über die GetDiskFreeSpaceEx Function gestolpert und wollte probieren, wie man sie zum laufen bringen könnte.

Da dort nun also stand, dass ULarge Integer zurückgegeben werden, die aus 64Bit bestehen, dachte ich mir: 64Bit=8Byte=2Integer => Bank erstellen mit Größe 8 Byte , Bank an die Funktion übergeben, danach PeekInt...

Mein Ziel war hierbei eigentlich nur die Anzahl der freien Bytes auf der Festplatte rauszufinden... also lpTotalNumberOfFreeBytes...
nur der Int beim Bankoffset 0 ist bei mir negativ und der Int bei Bankoffset 4 ist 0... liegt das daran, dass ULarge Ints unsigned sind? Wenn ja, gibt es eine Möglichkeit trotzdem die Bytezahl rauszufinden, die auf der Festplatte frei ist?

MfG Marek
Wer lesen kann ist klar im Vorteil...
  • Zuletzt bearbeitet von Marek am Mi, Jul 09, 2008 22:45, insgesamt einmal bearbeitet

Silver_Knee

BeitragMi, Jul 09, 2008 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
du könntest den ersten Integer nehmen und ihn über string-mathe mit 2^32 (passt nicht in nen int also auch hier bei calc.exe ausrechnen lassen und in nen string kopieren) mal nehmen und den 2. Integer wiederum mit string mathe draufaddieren.

Das funzt aber nur wenn alle ints positiv sind.... Man kann das risiko umgehen enn man die zahl in 4 Shorts aufteilt.. die sind immer positiv und man kann sie dann über String-Mathe mit 2^0,2^16,2^32,2^48 mal nehmen und zusammenaddieren

Mit string mathe sind funktioenn gemeint die aus 2 Strings die Ziffern rausnehmen und diese Verrechnen. So kann man auch große zahlen miteinander multiplizieren addieren etc...

Starwar

BeitragMi, Jul 09, 2008 9:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, da bin ich auch grade dran Very Happy
Ich hab das gefunden aber noch nicht mehr:
http://www.vbarchiv.net/api/de...reespaceex
Ich denke mal um eine DLL kommtz man da nicht rum Sad
Sag bescheid wenn du was rausgefunden hast!
 

Marek

BeitragMi, Jul 09, 2008 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal Danke für die Antworten Smile

Habe grade nochmal drüber nachgedacht und habe eine Lösungsidee... wenn man ein Ergebniss in Byte haben will, reicht ein Integer natürlich nicht aus, denn der kann nur 2GB fassen... also lasse ich mir das Ergebniss einfach als Kilobyte ausgeben und kann dann sogar den freien Speicher von einer 1TerraByte Festplatte ausgeben lassen Smile
Die Funktion editier ich hier später rein, bin noch am basteln Smile Wenn mir ganz langweilig ist, schreib ich noch eine Funktion die dann noch Bytegenau ist. Wie? Naja, wenn man schon die Kilobyte Anzahl hat lässt man sich einfach nur noch den Rest an Bytes angeben, z.B. also F1 liefert 1024KB; F2 liefert 512Byte, gesammt Bytezahl ist 1024KB*1024+512Byte...
Mal schauen ob ichs hinbekomm Smile

MfG Marek

~Edit~
Und hier ist sie:

Code: [AUSKLAPPEN]
Function GetFreeDiskSpace(Disk$)
   Local GFDS_Bank=CreateBank(5),GFDS_s$,GFDS_i,GFDS_r
   api_GetDiskFreeSpaceEx(Disk$,GFDS_Bank,GFDS_Bank,GFDS_Bank)
   GFDS_s$=Right(Bin(PeekByte(GFDS_Bank,4)),8)
   For GFDS_i=1 To 8
      GFDS_r=GFDS_r+Int(Mid(GFDS_s$,GFDS_i,1))*2^(30-GFDS_i)
   Next
   GFDS_i=PeekInt(GFDS_Bank,0)
   If GFDS_i<0 Then
      GFDS_i=GFDS_i And $7FFFFFFF
      GFDS_r=GFDS_r+2^21
   EndIf
   GFDS_r=Floor(Float(GFDS_i/1024))+GFDS_r
   FreeBank GFDS_Bank
   Return GFDS_r
End Function


benötigt wird noch ein Teil der Kernel32 Userlib:
Code: [AUSKLAPPEN]
.lib "kernel32.dll"

api_GetDiskFreeSpaceEx (lpDirectoryName$, lpFreeBytesAvailable*, lpTotalNumberOfBytes*, lpTotalNumberOfFreeBytes*) : "GetDiskFreeSpaceExA"


Leider scheint sich die Ungenauigkeit der Blitzfloats mal wieder gegen mich zu stellen und das Floor(Float(GFDS_i/1024)) liefert in manchen Fällen ein um 1KB falsches Ergebniss (also statt 1024KB + 1023Byte wird 1025KB ausgegeben), wodurch eine Funktion die die übrigen Bytes ausgibt nicht umsetzbar ist. Schade, aber kann man nichts machen Smile Der komplette Threat das beste Beispiel für die Grenzen von BlitzBasic Smile Ich erspar mir einfach mal die Mühe, dass auf stringsys umzuschreiben...

MfG Marek
Wer lesen kann ist klar im Vorteil...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group