ULarge Integer [WinApi] ~gelöst~
Übersicht

MarekBetreff: ULarge Integer [WinApi] ~gelöst~ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, da bin ich auch grade dran ![]() 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 ![]() Sag bescheid wenn du was rausgefunden hast! |
||
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal Danke für die Antworten ![]() 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 ![]() Die Funktion editier ich hier später rein, bin noch am basteln ![]() Mal schauen ob ichs hinbekomm ![]() 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 ![]() ![]() MfG Marek |
||
Wer lesen kann ist klar im Vorteil... |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group