Страница: 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 использовать. Хотябы потому что это несложный "запрос"