tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
492
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PhoenixDH PhoenixDH ist offline Mitglied Platin
    Registriert seit
    Sep 2004
    Beiträge
    617
    Hallo zusammen,

    ich habe eine Windows Form mit genau diesem Code hier:
    http://support.microsoft.com/kb/225144/de

    Das Problem hierbei ist, das VB 2010 mit folgender Passage meckert:
    Code :
    1
    2
    3
    4
    
    Private Type LARGE_INTEGER
        lowpart As Long
        highpart As Long
    End Type

    Deswegen habe ich den wie folgt abgeändert:
    Code :
    1
    2
    3
    4
    
        Private Structure LARGE_INTEGER
            Dim lowpart As Long
            Dim highpart As Long
        End Structure

    Zu dem Problem:
    Der Code ist zwar fehlerfrei, aber alle Ergebnisse sind 0 für Laufwerk C:\

    Woran könnte das liegen, kennt das wer?

    Danke.
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wenn du bestimmte Windows API Funktionen von .NET aus aufrufen willst, solltest du erstmal bei pinvoke.net suchen.

    http://pinvoke.net/default.aspx/core...eeSpaceEx.html

    Einfach Code kopieren und fertig. Der Code den du gefunden hast war für Visual Basic 6. In .NET gibt es einen eingebauten 64 Bit Integertyp (ulong), da brauchst du LARGE_INTEGER nicht zu definieren.

    Übrigens kannst du auch über die .NET DriveInfo Klasse die Größe und den freien Speicher ermitteln: http://msdn.microsoft.com/en-us/libr...driveinfo.aspx

    Gruß
    Geändert von deepthroat (17.05.11 um 09:04 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Mir stellt sich die Frage, wieso du unter .NET so eine alte Funktion verwenden willst. VB.NET bietet mit der DriveInfo-Klasse alles, was du benötigst:
    Code vb:
    1
    2
    3
    4
    
            For Each objDrive As System.IO.DriveInfo In System.IO.DriveInfo.GetDrives()
                'Wäre jetzt die Abfrage für C, kannst du natürlich an eigene Bedürfnisse anpassen
                If objDrive.Name.Substring(0, 1).ToLower = "c" Then MsgBox(objDrive.AvailableFreeSpace)
            Next


    Der Doc!
     
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von DrSoong Beitrag anzeigen
    Mir stellt sich die Frage, wieso du unter .NET so eine alte Funktion verwenden willst. VB.NET bietet mit der DriveInfo-Klasse alles, was du benötigst:
    Soweit mir bekannt ist, unterstützt .NETs DriveInfo Klasse keine eingebundenen Freigaben, die Windows API Funktion aber schon. Das wäre zumindest ein Grund die Funktion zu verwenden.
    Zitat Zitat von DrSoong Beitrag anzeigen
    Code vb:
    1
    2
    3
    4
    
            For Each objDrive As System.IO.DriveInfo In System.IO.DriveInfo.GetDrives()
                'Wäre jetzt die Abfrage für C, kannst du natürlich an eigene Bedürfnisse anpassen
                If objDrive.Name.Substring(0, 1).ToLower = "c" Then MsgBox(objDrive.AvailableFreeSpace)
            Next
    Geht natürlich auch einfacher wenn man nur von einem bestimmten Laufwerk die Information haben will:
    Code vb:
    1
    
    MsgBox(new DriveInfo("c").AvailableFreeSpace)
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    PhoenixDH PhoenixDH ist offline Mitglied Platin
    Registriert seit
    Sep 2004
    Beiträge
    617
    Dank euch schonmal für die vielen Antworten.
    Das ganze sollte eigentlich dann mal geändert werden um den Speicherplatz von Servern auszulesen, wie z.B.

    \\1.2.3.4\C$

    Geht das mit dem was ihr erwähnt habt auch?

    Was den ersten Code von pinvoke angeht, bin ich zu blöd?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
        Declare Function GetDiskFreeSpaceEx Lib "CoreDll.dll" ( _
            ByVal lpDirectoryName As String, _
            ByRef lpFreeBytesAvailable As UInt64, _
            ByRef lpTotalNumberOfBytes As UInt64, _
            ByRef lpTotalNumberOfFreeBytes As UInt64) As Integer
     
        Private Sub test()
            Dim lResult As Integer
            Dim liAvailable As UInt64
            Dim liTotal As UInt64
            Dim liFree As UInt64
     
            lResult = GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree)
     
            MsgBox(lResult)
        End Sub

    Muss dazusagen, bin noch neu auf dem Gebiet.
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von PhoenixDH Beitrag anzeigen
    Dank euch schonmal für die vielen Antworten.
    Das ganze sollte eigentlich dann mal geändert werden um den Speicherplatz von Servern auszulesen, wie z.B.

    \\1.2.3.4\C$

    Geht das mit dem was ihr erwähnt habt auch?
    Genau das geht eben nicht.
    Zitat Zitat von PhoenixDH Beitrag anzeigen
    Was den ersten Code von pinvoke angeht, bin ich zu blöd?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
        Declare Function GetDiskFreeSpaceEx Lib "CoreDll.dll" ( _
            ByVal lpDirectoryName As String, _
            ByRef lpFreeBytesAvailable As UInt64, _
            ByRef lpTotalNumberOfBytes As UInt64, _
            ByRef lpTotalNumberOfFreeBytes As UInt64) As Integer
     
        Private Sub test()
            Dim lResult As Integer
            Dim liAvailable As UInt64
            Dim liTotal As UInt64
            Dim liFree As UInt64
     
            lResult = GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree)
     
            MsgBox(lResult)
        End Sub

    Muss dazusagen, bin noch neu auf dem Gebiet.
    Der Rückgabewert der Funktion ist lediglich ein BOOL (1 oder 0).
    Code vb:
    1
    2
    3
    
    if GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree) <> 0 Then
      MsgBox(liAvailable)
    end if
    \edit: Das Beispiel auf pinvoke hast du gesehen?
    \edit2: Ich würde die Funktion gleich mit Boolean als Rückgabetyp deklarieren, so wie die C# und die erste VB.NET Signatur zeigen.

    Gruß
    Geändert von deepthroat (17.05.11 um 09:43 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    PhoenixDH PhoenixDH ist offline Mitglied Platin
    Registriert seit
    Sep 2004
    Beiträge
    617
    Wenn das nicht geht remote den Speicher auszulesen kann ich eh an der Stelle abbrechen.
    Ja, das Bsp. hab ich gesehen, das läuft aber auch net bei meinem VB Code.

    Gibt es irgendetwas womit das gehen würde?
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von PhoenixDH Beitrag anzeigen
    Wenn das nicht geht remote den Speicher auszulesen kann ich eh an der Stelle abbrechen.
    Hast du gelesen was ich geschrieben habe? Ich sagte es geht nicht mit der DriveInfo Klasse. Mit GetDiskFreeSpaceEx geht das.
    Zitat Zitat von PhoenixDH Beitrag anzeigen
    Ja, das Bsp. hab ich gesehen, das läuft aber auch net bei meinem VB Code.
    Es ist ja auch C#. Das mußt du übersetzen, z.B. hier http://www.developerfusion.com/tools.../csharp-to-vb/

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    PhoenixDH PhoenixDH ist offline Mitglied Platin
    Registriert seit
    Sep 2004
    Beiträge
    617
    Dann habe ich das verdreht.
    Ich habe das mal konvertiert, dann bekomme ich doch das hier, incl. dem Boolean:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
        Declare Function GetDiskFreeSpaceEx Lib "CoreDll.dll" ( _
            ByVal lpDirectoryName As String, _
            ByRef lpFreeBytesAvailable As UInt64, _
            ByRef lpTotalNumberOfBytes As UInt64, _
            ByRef lpTotalNumberOfFreeBytes As UInt64) As Boolean
     
        Private Sub test()
            Dim FreeBytesAvailable As ULong
            Dim TotalNumberOfBytes As ULong
            Dim TotalNumberOfFreeBytes As ULong
     
            Dim success As Boolean = GetDiskFreeSpaceEx("C:\", FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes)
            If Not success Then
                Throw New System.ComponentModel.Win32Exception()
            End If
     
            MsgBox(FreeBytesAvailable)
            MsgBox(TotalNumberOfBytes)
            MsgBox(TotalNumberOfFreeBytes)
        End Sub

    Das läuft nicht.
    Danke!
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von PhoenixDH Beitrag anzeigen
    Das läuft nicht.
    Wie äußert sich das?
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    PhoenixDH PhoenixDH ist offline Mitglied Platin
    Registriert seit
    Sep 2004
    Beiträge
    617
    Ich habe das ganze als Funktion aufgerufen innerhalb meiner App mit
    Code :
    1
    
    test()

    Wenn ich die App starte passiert darin nichts, keine Berechnungen und Ausgaben, auch keine MSGBOX.
    Aber keine Fehlermeldungen.
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Dann führe das mal im Debugger aus und gehe einfach Schritt für Schritt durch.

    \edit: Hab es gerade mal probiert. Er findet die coredll.dll nicht. Laut MSDN ist die Funktion in der kernel32 definiert, die coredll.dll ist wohl exklusiv für das .NET Compact Framework relevant.

    Code vb:
    1
    2
    3
    4
    5
    6
    7
    
        <DllImport("kernel32", EntryPoint:="GetDiskFreeSpaceEx", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function GetDiskFreeSpaceEx( _
        ByVal lpDirectoryName As String, _
        ByRef lpFreeBytesAvailable As ULong, _
        ByRef lpTotalNumberOfBytes As ULong, _
        ByRef lpTotalNumberOfFreeBytes As ULong) As Boolean
        End Function

    \edit: Mea culpa. Ich hatte den falschen Link gepostet. Hier der richtige: http://pinvoke.net/default.aspx/kern...eeSpaceEx.html

    Den Hinweis mit coredll.dll auf der Seite hatte ich nicht gesehen...

    Gruß
    Geändert von deepthroat (17.05.11 um 10:47 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    PhoenixDH PhoenixDH ist offline Mitglied Platin
    Registriert seit
    Sep 2004
    Beiträge
    617
    Danke!

    Jetzt hauts hin, ich bekomme ne MSGBOX mit Werten.
    Jetzt muss ich mich nur noch um die Umrechnung kümmern.

    Danke!
     

Ähnliche Themen

  1. Office 2010 Seiten nummerierungs Problem
    Von Drawlix im Forum Office-Anwendungen
    Antworten: 2
    Letzter Beitrag: 28.03.11, 07:16
  2. Qt 2010.04 nicht mehr Abwärskompatibel zu 2010.03?
    Von thekiller im Forum Coders Talk
    Antworten: 2
    Letzter Beitrag: 05.07.10, 10:59
  3. 2D/3D Contest - MEIN TRAUMHAUS - 23.02.2010-22.03.2010 - Teilnahmebedingungen
    Von smileyml im Forum 2D/3D Grafik-Contest - "Traumhaus"
    Antworten: 12
    Letzter Beitrag: 20.03.10, 17:12
  4. 2D/3D Contest - MEIN TRAUMHAUS - 23.02.2010 - 22.03.2010
    Von smileyml im Forum Grafik-Contests
    Antworten: 5
    Letzter Beitrag: 17.03.10, 13:49