Вопрос: проблема с WMI (Win32_LogicalDisk) | Добавлено: 15.02.08 17:29 |
Автор вопроса: ![]() |
Такой кусок должен вывести все диски и их тип:
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 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 15.02.08 18:44 |
1. Забей на эту батву
2. Юзай FSO и контрол Drive с Visible = False. Старый и топорный, но надежный способ. |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #2 | Добавлено: 15.02.08 21:22 |
Юзай FSO и контрол Drive с Visible = False. Старый и топорный, но надежный способ.
Сразу видно что ты не занимался отпимизацией программ. Этот способ слишком топорный... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #3 | Добавлено: 15.02.08 22:34 |
1. Забей на эту батву
2. Юзай win API. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #4 | Добавлено: 15.02.08 22:56 |
Полностью согласен с HACKER. Только непомню как это на АПИ делается. (Не в том смысле что "быстро", а в том смысле что код непомню)
|
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 15.02.08 23:21 |
Делается это вот так. Помню я специально создал тему и допытывался, как получить все removable-диски оптимальным способом. Пришли к такому варианту, не знаю мож и лучше можно..
Option Explicit
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 ![]() ![]() Call GetLogicalDriveStrings(DrivesStrLen, DrivesStr) ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 3 |
Профиль | Цитата | #6 | Добавлено: 15.02.08 23:50 |
за FSO спасибо, попробую, хотя это немного не то.
с апи проблем нет, все выводит, я пробовал, надо WMI сделать. по-крайней мере попробовать раздолбать этот цикл. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 36 Ответов: 326 |
Профиль | Цитата | #7 | Добавлено: 16.02.08 00:32 |
to Winand
мне хватало этого... Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Sub GetLgDr() Dim DriveType As Long For i = 97 To 122 ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #8 | Добавлено: 16.02.08 00:33 |
sdf, назови хоть одну причину чем в данном случае WMI лучше чем API? А то блин заснуть не смогу... ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 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(" ![]() ![]() s &= (CStr(disk(" ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 16.02.08 01:19 |
night-roll, собственно изначально я именно таким вариантом и пользовался. Но перебирать все буквы - это всё-таки неправильный подход |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 36 Ответов: 326 |
Профиль | Цитата | #11 | Добавлено: 16.02.08 01:35 |
это всё-таки неправильный подход согласен! но это не так уж криво по сравнению с получаемым результатом (оно того стОит, чтобы извращаться?)
|
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 16.02.08 02:58 |
конечно не стоит. Но я принципиально искал "правильный" способ |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #13 | Добавлено: 16.02.08 06:35 |
Там можно просто выйти из цикла, когда GetDriveType возвращает ошибку. И никакого перебора всех дисков небудет, будет только существующих.
назови хоть одну причину чем в данном случае WMI лучше чем API?
Ну WMI гораздо гибче и быстрее в плане времени разработки. Ты ж SQL запрос не скормишь API? ![]() |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 16.02.08 17:04 |
HACKER, на моем компе диски A C D E G N
Ошибку возвратит уже на диске B. |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #15 | Добавлено: 16.02.08 19:37 |
Ну WMI гораздо гибче и быстрее в плане времени разработки. Ты ж SQL запрос не скормишь API?
Но в данном случае все-таки лучше API использовать. Хотябы потому что это несложный "запрос" |
|