ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
492
492
EMPFEHLEN
-
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.
-
17.05.11 09:00 #2
- 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.
-
17.05.11 09:08 #3
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?
-
17.05.11 09:28 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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.
Geht natürlich auch einfacher wenn man nur von einem bestimmten Laufwerk die Information haben will:
GrußCode vb:1
MsgBox(new DriveInfo("c").AvailableFreeSpace)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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.
-
17.05.11 09:36 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Genau das geht eben nicht.
Der Rückgabewert der Funktion ist lediglich ein BOOL (1 oder 0).
\edit: Das Beispiel auf pinvoke hast du gesehen?Code vb:1 2 3
if GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree) <> 0 Then MsgBox(liAvailable) end if
\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.
-
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?
-
17.05.11 09:51 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hast du gelesen was ich geschrieben habe? Ich sagte es geht nicht mit der DriveInfo Klasse. Mit GetDiskFreeSpaceEx geht das.
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.
-
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!
-
17.05.11 10:10 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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.
-
17.05.11 10:39 #12
- 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.
-
Danke!
Jetzt hauts hin, ich bekomme ne MSGBOX mit Werten.
Jetzt muss ich mich nur noch um die Umrechnung kümmern.
Danke!
Ähnliche Themen
-
Office 2010 Seiten nummerierungs Problem
Von Drawlix im Forum Office-AnwendungenAntworten: 2Letzter Beitrag: 28.03.11, 07:16 -
Qt 2010.04 nicht mehr Abwärskompatibel zu 2010.03?
Von thekiller im Forum Coders TalkAntworten: 2Letzter Beitrag: 05.07.10, 10:59 -
2D/3D Contest - MEIN TRAUMHAUS - 23.02.2010-22.03.2010 - Teilnahmebedingungen
Von smileyml im Forum 2D/3D Grafik-Contest - "Traumhaus"Antworten: 12Letzter Beitrag: 20.03.10, 17:12 -
2D/3D Contest - MEIN TRAUMHAUS - 23.02.2010 - 22.03.2010
Von smileyml im Forum Grafik-ContestsAntworten: 5Letzter Beitrag: 17.03.10, 13:49





Zitieren

Login





