Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
Юзай FSO и контрол Drive с Visible = False. Старый и топорный, но надежный способ.

Сразу видно что ты не занимался отпимизацией программ. Этот способ слишком топорный...

Ответить

Номер ответа: 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-сайт: winandfx.narod.ru
 Профиль | | #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

    ;DrivesStrLen = GetLogicalDriveStrings(0, vbNullString)
    ;DrivesStr = Space(DrivesStrLen)
    Call GetLogicalDriveStrings(DrivesStrLen, DrivesStr)
    ;DrivesArr = 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
мне хватало этого...
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
    ;DriveType = 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(";DriveType";), UInt32)

            s &= (CStr(disk(";DeviceID";)) & " " & 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-сайт: winandfx.narod.ru
 Профиль | | #10
Добавлено: 16.02.08 01:19
night-roll, собственно изначально я именно таким вариантом и пользовался. Но перебирать все буквы - это всё-таки неправильный подход

Ответить

Номер ответа: 11
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #11 Добавлено: 16.02.08 01:35
это всё-таки неправильный подход
согласен! но это не так уж криво по сравнению с получаемым результатом (оно того стОит, чтобы извращаться?)

Ответить

Номер ответа: 12
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #12
Добавлено: 16.02.08 02:58
конечно не стоит. Но я принципиально искал "правильный" способ

Ответить

Номер ответа: 13
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #13 Добавлено: 16.02.08 06:35
Там можно просто выйти из цикла, когда GetDriveType возвращает ошибку. И никакого перебора всех дисков небудет, будет только существующих.

назови хоть одну причину чем в данном случае WMI лучше чем API?

Ну WMI гораздо гибче и быстрее в плане времени разработки. Ты ж SQL запрос не скормишь API? :)

Ответить

Номер ответа: 14
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #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
Ну WMI гораздо гибче и быстрее в плане времени разработки. Ты ж SQL запрос не скормишь API?

Но в данном случае все-таки лучше API использовать. Хотябы потому что это несложный "запрос"

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам