Vb6 如何获取当前的硬盘类型?

Vb6 如何获取当前的硬盘类型?,vb6,wmi,master-slave,hdd,Vb6,Wmi,Master Slave,Hdd,我找到了一种在vb6中获取hdd序列号的方法。但它需要从中选择一个选项 主控 主从 中学校长 次从机 但我想自动选择一个选项。自动选择逻辑为 假设我有4个以上4种类型的硬盘。逻辑将选择加载当前系统的hdd类型 我真的不知道如何检测当前的系统是哪个硬盘类型。请帮忙 下面是我用来选择HDD序列号的类。下面的代码应该有帮助: Option Explicit Private Const FILE_SHARE_READ = &H1 Private Const FILE_SHARE_WRITE

我找到了一种在vb6中获取hdd序列号的方法。但它需要从中选择一个选项

  • 主控
  • 主从
  • 中学校长
  • 次从机
但我想自动选择一个选项。自动选择逻辑为

假设我有4个以上4种类型的硬盘。逻辑将选择加载当前系统的hdd类型

我真的不知道如何检测当前的系统是哪个硬盘类型。请帮忙


下面是我用来选择HDD序列号的类。

下面的代码应该有帮助:

Option Explicit

Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3

Private Const IOCTL_VOLUME_BASE     As Long = 86 ' Asc("V")
Private Const METHOD_BUFFERED       As Long = 0
Private Const FILE_READ_ACCESS      As Long = 1
Private Const FILE_ANY_ACCESS       As Long = 0

'DEFINE IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
Private Const IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = (((IOCTL_VOLUME_BASE) * (2& ^ 16&)) Or ((FILE_ANY_ACCESS) * (2& ^ 14&)) Or ((0&) * (2& ^ 2&)) Or (METHOD_BUFFERED))

Private Type DISK_EXTENT
    DiskNumber          As Long
    StartingOffset      As Currency
    ExtentLength        As Currency
End Type

Private Type VOLUME_DISK_EXTENTS
    NumberOfDiskExtents As Currency
    Extents(1 To 4)     As DISK_EXTENT
End Type

Private Declare Function CreateFile _
    Lib "kernel32" Alias "CreateFileA" _
    (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long

Private Declare Function CloseHandle _
    Lib "kernel32" _
    (ByVal hObject As Long) As Long

Private Declare Function GetWindowsDirectory Lib "Kernel32.dll" Alias "GetWindowsDirectoryW" ( _
    ByVal lpBuffer As Long, _
    ByVal uSize As Long _
) As Long

Private Declare Function DeviceIoControlNoInput _
    Lib "kernel32" Alias "DeviceIoControl" _
    (ByVal hDevice As Long, _
    ByVal dwIoControlCode As Long, _
    ByVal lpInBuffer As Long, _
    ByVal nInBufferSize As Long, _
    ByRef lpOutBuffer As Any, _
    ByVal nOutBufferSize As Long, _
    ByRef lpBytesReturned As Long, _
    ByVal lpOverlapped As Long) As Long

' Return the index of the physical drive from which we've booted into Windows. 
Public Function GetBootPhysicalDrive() As Long

    Dim sWindowsPath        As String
    Dim nRet                As Long
    Dim sDevicePath         As String
    Dim hLogicalBootDrive   As Long
    Dim sVolumeDevice       As String
    Dim uVolumeDiskExtents  As VOLUME_DISK_EXTENTS
    Dim nBytesReturned      As Long

    ' Allocate space and retrieve the windows directory.
    sWindowsPath = Space$(64)
    nRet = GetWindowsDirectory(StrPtr(sWindowsPath), 64)

    ' This gives us the volume that Windows is on. Open it.
    sVolumeDevice = "\\.\" & Left$(sWindowsPath, 2)
    hLogicalBootDrive = CreateFile(sVolumeDevice, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)

    ' Find out information about this volume.
    nRet = DeviceIoControlNoInput(hLogicalBootDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0&, 0&, uVolumeDiskExtents, LenB(uVolumeDiskExtents), nBytesReturned, 0&)

    If nRet = 0 Then
    ' Something went wrong. Return error value.
        GetBootPhysicalDrive = -1
    Else
    ' This is the physical disk number.
        GetBootPhysicalDrive = uVolumeDiskExtents.Extents(1).DiskNumber
    End If

    ' Close volume.
    CloseHandle hLogicalBootDrive

End Function
使用Mark Bertenshaw的解决方案,我在一个模块中编写了以下内容,并调用了
GetDiskSerialNumber
函数来获取当前系统启动时所使用的硬盘的序列号。这是我的模块代码:

Option Explicit

Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3

Private Const IOCTL_VOLUME_BASE     As Long = 86 ' Asc("V")
Private Const METHOD_BUFFERED       As Long = 0
Private Const FILE_READ_ACCESS      As Long = 1
Private Const FILE_ANY_ACCESS       As Long = 0

'DEFINE IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
Private Const IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = (((IOCTL_VOLUME_BASE) * (2& ^ 16&)) Or ((FILE_ANY_ACCESS) * (2& ^ 14&)) Or ((0&) * (2& ^ 2&)) Or (METHOD_BUFFERED))

Private Type DISK_EXTENT
    DiskNumber          As Long
    StartingOffset      As Currency
    ExtentLength        As Currency
End Type

Private Type VOLUME_DISK_EXTENTS
    NumberOfDiskExtents As Currency
    Extents(1 To 4)     As DISK_EXTENT
End Type

Private Declare Function CreateFile _
    Lib "kernel32" Alias "CreateFileA" _
    (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long

Private Declare Function CloseHandle _
    Lib "kernel32" _
    (ByVal hObject As Long) As Long

Private Declare Function GetWindowsDirectory Lib "Kernel32.dll" Alias "GetWindowsDirectoryW" ( _
    ByVal lpBuffer As Long, _
    ByVal uSize As Long _
) As Long

Private Declare Function DeviceIoControlNoInput _
    Lib "kernel32" Alias "DeviceIoControl" _
    (ByVal hDevice As Long, _
    ByVal dwIoControlCode As Long, _
    ByVal lpInBuffer As Long, _
    ByVal nInBufferSize As Long, _
    ByRef lpOutBuffer As Any, _
    ByVal nOutBufferSize As Long, _
    ByRef lpBytesReturned As Long, _
    ByVal lpOverlapped As Long) As Long

' Return the index of the physical drive from which we've booted into Windows. 
Public Function GetBootPhysicalDrive() As Long

    Dim sWindowsPath        As String
    Dim nRet                As Long
    Dim sDevicePath         As String
    Dim hLogicalBootDrive   As Long
    Dim sVolumeDevice       As String
    Dim uVolumeDiskExtents  As VOLUME_DISK_EXTENTS
    Dim nBytesReturned      As Long

    ' Allocate space and retrieve the windows directory.
    sWindowsPath = Space$(64)
    nRet = GetWindowsDirectory(StrPtr(sWindowsPath), 64)

    ' This gives us the volume that Windows is on. Open it.
    sVolumeDevice = "\\.\" & Left$(sWindowsPath, 2)
    hLogicalBootDrive = CreateFile(sVolumeDevice, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)

    ' Find out information about this volume.
    nRet = DeviceIoControlNoInput(hLogicalBootDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0&, 0&, uVolumeDiskExtents, LenB(uVolumeDiskExtents), nBytesReturned, 0&)

    If nRet = 0 Then
    ' Something went wrong. Return error value.
        GetBootPhysicalDrive = -1
    Else
    ' This is the physical disk number.
        GetBootPhysicalDrive = uVolumeDiskExtents.Extents(1).DiskNumber
    End If

    ' Close volume.
    CloseHandle hLogicalBootDrive

End Function

Public Function GetDiskSerialNumber() As String
    Dim wmiObject As Object
    Dim obj As Object

    Set wmiObject = GetObject("WinMgmts:")
    For Each obj In wmiObject.InstancesOf("Win32_PhysicalMedia")
        If obj.Tag = "\\.\PHYSICALDRIVE" + CStr(GetBootPhysicalDrive) Then GetDiskSerialNumber = obj.Tag + " : " + obj.SerialNumber
    Next obj
End Function

非常感谢。

我收到了<代码>公共函数GetDiskSerialNumber()作为字符串Dim wmiObject作为对象Dim obj作为对象集wmiObject=GetObject(“WinMgmts:”)用于wmiObject.InstancesOf(“Win32\U PhysicalMedia”)中的每个对象,如果obj.Tag=“\\.\PHYSICALDRIVE”+CStr(GetBootPhysicalDrive)然后GetDiskSerialNumber=obj.SerialNumber下一个obj结束函数