Страница: 1 | 2 |
Вопрос: проблема с WMI (Win32_LogicalDisk)
Добавлено: 15.02.08 17:29
Автор вопроса: sdf
Такой кусок должен вывести все диски и их тип:
Dim disk, colDisks
Set colDisks = GetObject("WinMgmts:").InstancesOf("Win32_LogicalDisk")
For Each disk In colDisks
Text9.Text = disk.DeviceID & vbTab & disk.MediaType & vbCrLf
Next
Выводит этот простой цикл только один диск и его тип. Даже в MSDN такой же цикл дан в пример, но у меня не работает. Почему так?
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #1
Добавлено: 15.02.08 18:44
1. Забей на эту батву
2. Юзай FSO и контрол Drive с Visible = False. Старый и топорный, но надежный способ.
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 15.02.08 21:22
Сразу видно что ты не занимался отпимизацией программ. Этот способ слишком топорный...
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 15.02.08 22:34
1. Забей на эту батву
2. Юзай win API.
Номер ответа: 4
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #4
Добавлено: 15.02.08 22:56
Полностью согласен с HACKER. Только непомню как это на АПИ делается. (Не в том смысле что "быстро", а в том смысле что код непомню)
Номер ответа: 5
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #5
Добавлено: 15.02.08 23:21
Делается это вот так. Помню я специально создал тему и допытывался, как получить все removable-диски оптимальным способом. Пришли к такому варианту, не знаю мож и лучше можно..
Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
'Private Const DRIVE_UNKNOWN As Long = 0
'Private Const DRIVE_NO_ROOT_DIR As Long = 1
Private Const DRIVE_REMOVABLE As Long = 2
'Private Const DRIVE_FIXED As Long = 3
'Private Const DRIVE_REMOTE As Long = 4
Private Const DRIVE_CDROM As Long = 5
'Private Const DRIVE_RAMDISK As Long = 6
Public mLetters(25) As String * 3
Public mCount As Long
Public Sub GetRemDriveLetters()
Dim DrivesStr As String 'lpBuffer
Dim DrivesStrLen As Long 'nBufferLength
Dim DrivesArr() As String 'ALL Drives Array
Dim drvType As Long '= GetDriveType
Dim i As Long
mCount = 0
 rivesStrLen = GetLogicalDriveStrings(0, vbNullString)
 rivesStr = Space(DrivesStrLen)
Call GetLogicalDriveStrings(DrivesStrLen, DrivesStr)
 rivesArr = Split(DrivesStr, vbNullChar)
For i = 0 To UBound(DrivesArr) - 2
Select Case GetDriveType(DrivesArr(i))
Case DRIVE_REMOVABLE ', DRIVE_CDROM
mLetters(mCount) = DrivesArr(i)
mCount = mCount + 1
End Select
Next
End Sub
Номер ответа: 6
Автор ответа:
sdf
Вопросов: 3
Ответов: 3
Профиль | | #6
Добавлено: 15.02.08 23:50
за FSO спасибо, попробую, хотя это немного не то.
с апи проблем нет, все выводит, я пробовал, надо WMI сделать. по-крайней мере попробовать раздолбать этот цикл.
Номер ответа: 7
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #7
Добавлено: 16.02.08 00:32
to Winand
мне хватало этого...
Sub GetLgDr()
Dim DriveType As Long
For i = 97 To 122
 riveType = GetDriveType(Chr(i) & ":\"
Select Case DriveType
Case 1
'Debug.Print "Диск " & Chr(i) & " не существует"
Case 2
Debug.Print "Диск " & Chr(i) & " съёмный."
Case 3
Debug.Print "Диск " & Chr(i) & " жёсткий."
Case 4
Debug.Print "Диск " & Chr(i) & " сетевой."
Case 5
Debug.Print "Диск " & Chr(i) & " CD-ROM."
Case 6
Debug.Print "Диск " & Chr(i) & " RAM диск."
End Select
Next i
End Sub
Номер ответа: 8
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #8
Добавлено: 16.02.08 00:33
sdf, назови хоть одну причину чем в данном случае WMI лучше чем API? А то блин заснуть не смогу...
Номер ответа: 9
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #9
Добавлено: 16.02.08 00:41
Private Function get_removable_devices() As Char()
Dim diskClass As New System.Management.ManagementClass("Win32_LogicalDisk"
' Dim diskClass As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk WHERE ((DriveType = 2) OR (DriveType = 3) OR (DriveType = 4))"
Dim disk As System.Management.ManagementObject
Dim s As String
Dim u As UInt32
For Each disk In diskClass.Get()
u = DirectCast(disk("riveType", UInt32)
s &= (CStr(disk("eviceID") & " " & get_media_type(u) & " " & ControlChars.CrLf)
Next disk
MsgBox(s)
End Function
Private Function get_media_type(ByVal u As UInt32) As String
Select Case u.ToString
Case "0" : Return "Unknown"
Case "1" : Return "No Root Directory"
Case "2" : Return "Removable Disk"
Case "3" : Return "Local Disk"
Case "4" : Return "Network Drive"
Case "5" : Return "Compact Disc"
Case "6" : Return "RAM Disk"
End Select
End Function
Номер ответа: 10
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #10
Добавлено: 16.02.08 01:19
night-roll, собственно изначально я именно таким вариантом и пользовался. Но перебирать все буквы - это всё-таки неправильный подход
Номер ответа: 11
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #11
Добавлено: 16.02.08 01:35
Номер ответа: 12
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #12
Добавлено: 16.02.08 02:58
конечно не стоит. Но я принципиально искал "правильный" способ
Номер ответа: 13
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #13
Добавлено: 16.02.08 06:35
Там можно просто выйти из цикла, когда GetDriveType возвращает ошибку. И никакого перебора всех дисков небудет, будет только существующих.
Ну WMI гораздо гибче и быстрее в плане времени разработки. Ты ж SQL запрос не скормишь API?
Номер ответа: 14
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #14
Добавлено: 16.02.08 17:04
HACKER, на моем компе диски A C D E G N
Ошибку возвратит уже на диске B.
Номер ответа: 15
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #15
Добавлено: 16.02.08 19:37
Но в данном случае все-таки лучше API использовать. Хотябы потому что это несложный "запрос"