Toon posts:

[VB6][Overflow]Tijdens uitlezen vrije hdd ruimte

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik ben bezig met een kloon van het programma mIrc, alleen dan met standaard ingebouwde scripts. Zoals het laten zien van je harde schijf info.
Nu krijg ik steeds een overflow error maar snap niet waar deze vandaan komt
Dit heb ik in General Declarations staan:
Visual Basic:
1
2
3
4
5
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, lpFreeBytesAvailableToCaller As Currency, lpTotalNumberOfBytes As Currency, lpTotalNumberOfFreeBytes As Currency) As Long
Private Declare Function StrFormatByteSize Lib _
    "shlwapi" Alias "StrFormatByteSizeA" (ByVal _
    dw As Long, ByVal pszBuf As String, ByRef _
    cchBuf As Long) As String


Dit staat in de functie die de harde schijf info uitleest
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
    Dim strDriveCFree As String
    Dim strDriveCTotal As String
    Dim strDriveDFree As String
    Dim strDriveDTotal As String
    Dim strDriveEFree As String
    Dim strDriveETotal As String
    
    strDriveCFree = FormatKB(DiscSpace("C:", 0))
    strDriveCTotal = FormatKB(DiscSpace("C:", 1))
    strDriveDFree = FormatKB(DiscSpace("D:", 0))
    strDriveDTotal = FormatKB(DiscSpace("D:", 1))
    strDriveEFree = FormatKB(DiscSpace("E:", 0))
    strDriveETotal = FormatKB(DiscSpace("E:", 1))


En dan gebruik ik deze strings in de funcite voor het irc.sendmessage gedeelte wat verder wel naar behoren werkt.
En dan hebben we nog de volgende functies die dus daadwerkelijk de harde schijf benaderen en het spul in een beetje leesbaar formaat maakt:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Function DiscSpace(ByVal DrvLetter As String, ByVal intOption As Integer)
Dim Status As Long
Dim TotalBytes As Currency
Dim FreeBytes As Currency
Dim BytesAvailableToCaller As Currency
Status = GetDiskFreeSpaceEx(DrvLetter, BytesAvailableToCaller, _
TotalBytes, FreeBytes)
If Status <> 0 Then
    Select Case intOption
        Case 0: DiscSpace = FreeBytes * 10000
        Case 1: DiscSpace = TotalBytes * 10000
    End Select
End If
End Function

Private Function FormatKB(ByVal Amount As Long) As String
    Dim Buffer As String
    Dim Result As String
    FormatKB = ""
    Buffer = Space$(255)
    Result = StrFormatByteSize(Amount, Buffer, _
    Len(Buffer))

    If InStr(Result, vbNullChar) > 1 Then
        FormatKB = Left$(Result, InStr(Result, _
            vbNullChar) - 1)
    End If
End Function


Weet iemand waar deze overflow vandaan komt en hoe ik deze kan oplossen? Ik vermoed dat ik teveel vrije ruimte heb waardoor FormatKB hem niet kan verwerken maar dat kan ik fout hebben

[ Voor 4% gewijzigd door Verwijderd op 03-12-2004 18:13 . Reden: typo ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:59

mulder

ik spuug op het trottoir

In de code hierboven is DiscSpace een Variant zou dat het kunnen zijn?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Eeeuh dat volg ik niet helemaal, hoe bedoel je dat?

  • Pink Panther
  • Registratie: Juni 2003
  • Laatst online: 14-05 18:15
Je hebt diskspace als een integer gedeclareerd. Ik kan me voorstellen dat je hier een overflow bij krijgt want een integer mag dacht ik maximaal 32768 groot zijn. Als je hem dan ook nog eens met 1000 vermenigvuldigd is de kans zeer groot dat je inderdaad een overflow krijgt. Definieer diskspace als een long ofzo waardoor er groetere waardes zijn toegestaan.

Verwijderd

ja een type variant bepaald zelf het meest geschikte datatype, dus dat zou hij zelf moeten bepalen dan. Overflow komt omdat je datatype gewoon te klein is, en ik denk dat een long gewono te klein is voor dit type datatype. je zal het aantal kb's moeten delen door een factor (1000) ofzo, en dan bij het ophalen terug * 1000 doen ofzo denk ik.

Verwijderd

Verwijderd schreef op vrijdag 03 december 2004 @ 18:40:
ja een type variant bepaald zelf het meest geschikte datatype, dus dat zou hij zelf moeten bepalen dan. Overflow komt omdat je datatype gewoon te klein is, en ik denk dat een long gewono te klein is voor dit type datatype. je zal het aantal kb's moeten delen door een factor (1000) ofzo, en dan bij het ophalen terug * 1000 doen ofzo denk ik.
Bijna. Diskruimte is een 64-bit unsigned integer. Zie de API beschrijving (bv op MSDN) van deze functie.

Verwijderd

Topicstarter
Dus als ik het goed begrijp zit de fout in:
Visual Basic:
1
Private Function FormatKB(ByVal Amount As Long) As String


Maar wat zal het dan moeten worden om het wel te laten werken? Ik zal het dan ergens een keer moeten delen en later weel vermenigvuldigen als ik het goed begrijp maar ik snap dus niet waar ik dan zal moeten delen

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:59

mulder

ik spuug op het trottoir

Nej, deze:
code:
1
Private Function DiscSpace(ByVal DrvLetter As String, ByVal intOption As Integer)

Je geeft deze functie geen datatype, dus maakt VB er een Variant van.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ah ok nu begin ik het te snappen, ik heb hem nu als Long gedefinieerd en nu zie ik een overflow bij het volgende gedeelte:
Visual Basic:
1
Case 1: DiscSpace = TotalBytes * 10000

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Redelijk basic programmeer werk. Een overflow is precies wat het zegt te zijn: Je waarde past gewoon niet in je variabele. Bedenk dat in een long max. een waarde past van 2.1Miljardnogwat* en 4.2Miljardnogwat unsigned (maar daar heb je niks mee van doen). Dat betekent dus dat er max. 4Gb in een Long past (en reken maar op 2 ;) ). Dat gaat niet passen.

Zoals bloog al schreef geeft GetDiskFreeSpaceEx een 64 bits unsigned integer terug. En dat is dus dubbel zo lang als een long. Overflow -> Gek he? :+

Als je GetDiskFreeSpaceEx in Google rost, en je klikt de eerste link dan heb je meteen de documentatie van die functie te pakken. Ook daar kun je lezen dat er een PULARGE_INTEGER wordt teruggegeven. Maar als je nou de 3e link had bekeken, dan had je zelfs van een andere (IMHO érg goede) bron complete voorbeeldcode gekregen.

Een andere erg goede bron in mentalis.org, en ook daar vind je op deze pagina een verwijzing naar documentatie en een voorbeeld voor VB.

Hoe dan ook, in je code stikt het van de longs en integers, en beide gaan niet voldoen (tenzij je geen bytes gaat tellen, maar MB's of Gb's. Dat zou je dan eventueel kunnen voorkomen door het resultaat van GetDiskFreeSpaceEx meteen te delen door 1024 voor Kb's, 1024*1024 voor Mb's etc en dan daarmee verder te werken).

* 2147483647 om precies te zijn, dus (2^31) -1 voor signed longs en 4294967295 of (2^31) -1 voor unsigned longs.

[ Voor 17% gewijzigd door RobIII op 04-12-2004 01:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1