Какому из физических HDD принадлежит логический диск? - VB
Формулировка задачи:
Количество жёстких дисков от 2-х. Как
без WMI
(если отключён),без FSO
и без Left$(App.Path, 3) определить сопоставления логических дисков физическим, пользуясь API?Решение задачи: «Какому из физических HDD принадлежит логический диск?»
textual
Листинг программы
Public Function MappingSearch(a$) Dim Ret As Long 'длина полезной информации от GetLogicalDriveStrings Dim DrivesString As String * 255 'здесь будут данные от GetLogicalDriveStrings Dim AllDrives$ 'общая строка для всех логич. дисков из функции GetLogicalDriveStrings Dim Tmp$ 'хранит букву диска в формате "A:" или "C:" Dim DeviceHandle As Long 'дескриптор объекта Dim i As Long 'для счёта дисков Dim CountBytesReturned As Long 'сколько байт вернула функция DeviceIoControl Dim OutBuffer(64) As Byte 'массив для хранения выданных от DeviceIoControl данных Dim DriveCount As Long 'кол-во логич. дисков после разбора строки AllDrives$ Dim start As Long Dim NameDiskPos As Long Ret = GetLogicalDriveStrings(Len(DrivesString), DrivesString) AllDrives$ = Left(DrivesString, Ret) 'отображаем все логические диски на компьютере start = 1 'стартовая позиция сканирования в InStr For i = 1 To Len(AllDrives$) NameDiskPos = InStr(start, AllDrives$, ":") If (NameDiskPos <> 0) Then inc DriveCount 'плюсуем 1 к логическим дискам Else Exit For End If start = NameDiskPos + 1 Next 'в массиве столько элементов, сколько нашли логических дисков '-1 из-за Option Base 0 ReDim Arr(DriveCount - 1) i = 0 'будем считать диски While (AllDrives$ <> vbNullString) Tmp$ = Mid$(AllDrives$, 1, InStr(AllDrives$, vbNullChar) - 2) 'берём одну букву диска в виде "A:" AllDrives$ = Mid$(AllDrives$, InStr(AllDrives$, vbNullChar) + 1) 'удаляем первые 3 символа из строки 'берём хэндл объекта, в данном случае это диск DeviceHandle = CreateFile("\\." & Tmp$, GENERIC_READ&, _ FILE_SHARE_READ, _ ByVal 0&, OPEN_EXISTING, 0, 0&) If (DeviceHandle = INVALID_HANDLE_VALUE) Then Arr(i).DriveName = Tmp$ Arr(i).DriveNumber = -1 'CreateFile не смог определить ресурс. Так и запишем. Else Ret = DeviceIoControl(DeviceHandle, _ IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, _ ByVal 0&, _ 0&, _ OutBuffer(0), _ 64, _ CountBytesReturned, _ ByVal 0&) If (Ret = 0) Then Arr(i).DriveName = Tmp$ Debug.Print "Буква диска -> " & Tmp$ 'не может найти зависимость. Обозначим как -2 Arr(i).DriveNumber = -2 a$ = a$ & "Буква раздела -> " & vbTab & Arr(i).DriveName & " на диске №" & vbTab & Arr(i).DriveNumber & vbCrLf Else Arr(i).DriveName = Tmp$ Arr(i).DriveNumber = OutBuffer(8) a$ = a$ & "Буква раздела -> " & vbTab & Arr(i).DriveName & " на диске №" & vbTab & Arr(i).DriveNumber & vbCrLf End If End If CloseHandle DeviceHandle 'выгружаем устройство inc i 'диск = диск + 1 Wend End Function Private Sub Form_Load() Call MappingSearch(a$) MsgBox a$ Unload Me End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д