想给我的程序加上注册功能,如何先得到硬件号?得到的硬件号应确保每台电脑不一样。能否给出较完整的代码?有人说得到硬盘序列号,再加其它硬件的号码,就能确保唯一,不知道代码怎么写?请高手帮忙了。谢谢。

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1526/1526713.xml?temp=.3353388
      

  2.   

    http://vip.6to23.com/NowCan1/tech/vb_hd_info.htm
    http://vip.6to23.com/NowCan1/code/hd_info.zip
      

  3.   

    得到硬盘序列号
    新建一个模文件,加入代码:Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongGlobal GethdVal As Long在form1_load事件中加入Dim Str1 As String * 256Dim Str2 As String * 256Dim Lon1 As LongDim Lon2 As LongCall GetVolumeInformation("C:\", Str1, 256, GetVal, Lon1, Lon2, Str2, 256)Text1.Text = GethdVal
      

  4.   

    楼上的只是得到 “硬盘格式化时随机生成的卷标序列号”,此序列号可以人为更改,并且如果克隆硬盘则该序列号则完全相同。
       
       不实用。看看下面的代码:
    -----------------------------'   功能说明:获取硬盘序列号、生产厂家/型号
    '   注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000
    '             XP没有测试,估计没问题,在Win9X下必须保证存在smartvsd.vxd
    '             放在System\Iosubsys目录下,smartvsd.VXD在98第二版安装盘的
    '             WIN98_62.CAB文件中
    '--------------------------------------------------------------------------
    '################################################################################
    '窗体中的调用方法:
    'Option Explicit'Private hdi As CDiskInfo'Private Sub Form_Load()
        'Set hdi = New CDiskInfo
        'hdi.GetDiskInfo 0
        '硬盘序列号: hdi.pSerialNumber
        '生产厂家/型号: hdi.pModelNumber
    'End Sub
    '################################################################################'________________________________________________________________________________Option Explicit
    '以下全部为名为CDiskinfo.cls的类模块
    '################################
    'http://vip.6to23.com/NowCan1/tech/vb_hd_info.htm
    '--------------------------------------------------------------------------
    '   类模块: CDiskInfo.cls
    '   功能说明:获取硬盘序列号、生产厂家/型号
    '   注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000
    '             XP没有测试,估计没问题,在Win9X下必须保证存在smartvsd.vxd
    '             放在System\Iosubsys目录下,smartvsd.VXD在98第二版安装盘的
    '             WIN98_62.CAB文件中
    '-----
    Private Const MAX_IDE_DRIVES As Long = 4
    Private Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512
    Private Const IDENTIFY_BUFFER_SIZE As Long = 512
    Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512
    Private Const DFP_GET_VERSION As Long = &H74080
    Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084
    Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088Private Type GETVERSIONOUTPARAMS
        bVersion As Byte
        bRevision As Byte
        bReserved As Byte
        bIDEDeviceMap As Byte
        fCapabilities As Long
        dwReserved(3) As Long
    End TypePrivate Const CAP_IDE_ID_FUNCTION As Long = 1
    Private Const CAP_IDE_ATAPI_ID As Long = 2
    Private Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4Private Type IDEREGS
        bFeaturesReg As Byte
        bSectorCountReg As Byte
        bSectorNumberReg As Byte
        bCylLowReg As Byte
        bCylHighReg As Byte
        bDriveHeadReg As Byte
        bCommandReg As Byte
        bReserved As Byte
    End TypePrivate Type SENDCMDINPARAMS
        cBufferSize As Long
        irDriveRegs As IDEREGS
        bDriveNumber As Byte
        bReserved(2) As Byte
        dwReserved(3) As Long
        bBuffer(0) As Byte
    End TypePrivate Const IDE_ATAPI_ID As Long = &HA1
    Private Const IDE_ID_FUNCTION As Long = &HEC
    Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0
    Private Const SMART_CYL_LOW As Long = &H4F
    Private Const SMART_CYL_HI As Long = &HC2Private Type DRIVERSTATUS
        bDriverError As Byte
        bIDEStatus As Byte
        bReserved(1) As Byte
        dwReserved(1) As Long
    End TypePrivate Const SMART_NO_ERROR As Long = 0
    Private Const SMART_IDE_ERROR As Long = 1
    Private Const SMART_INVALID_FLAG As Long = 2
    Private Const SMART_INVALID_COMMAND As Long = 3
    Private Const SMART_INVALID_BUFFER As Long = 4
    Private Const SMART_INVALID_DRIVE As Long = 5
    Private Const SMART_INVALID_IOCTL As Long = 6
    Private Const SMART_ERROR_NO_MEM As Long = 7
    Private Const SMART_INVALID_REGISTER As Long = 8
    Private Const SMART_NOT_SUPPORTED As Long = 9
    Private Const SMART_NO_IDE_DEVICE As Long = 10Private Type SENDCMDOUTPARAMS
        cBufferSize As Long
        drvStatus As DRIVERSTATUS
        bBuffer(0) As Byte
    End TypePrivate Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0
    Private Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1
    Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2
    Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3
    Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4
    Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8
    Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9
    Private Const SMART_RETURN_SMART_STATUS As Long = &HDAPrivate Type DRIVEATTRIBUTE
        bAttrID As Byte
        wStatusFlags As Integer
        bAttrValue As Byte
        bWorstValue As Byte
        bRawValue(5) As Byte
        bReserved As Byte
    End TypePrivate Type ATTRTHRESHOLD
        bAttrID As Byte
        bWarrantyThreshold As Byte
        bReserved(9) As Byte
    End TypePrivate Type IDSECTOR
        wGenConfig As Integer
        wNumCyls As Integer
        wReserved As Integer
        wNumHeads As Integer
        wBytesPerTrack As Integer
        wBytesPerSector As Integer
        wSectorsPerTrack As Integer
        wVendorUnique(2) As Integer
        sSerialNumber(19) As Byte
        wBufferType As Integer
        wBufferSize As Integer
        wECCSize As Integer
        sFirmwareRev(7) As Byte
        sModelNumber(39) As Byte
        wMoreVendorUnique As Integer
        wDoubleWordIO As Integer
        wCapabilities As Integer
        wReserved1 As Integer
        wPIOTiming As Integer
        wDMATiming As Integer
        wBS As Integer
        wNumCurrentCyls As Integer
        wNumCurrentHeads As Integer
        wNumCurrentSectorsPerTrack As Integer
        ulCurrentSectorCapacity(3) As Byte
        wMultSectorStuff As Integer
        ulTotalAddressableSectors(3) As Byte
        wSingleWordDMA As Integer
        wMultiWordDMA As Integer
        bReserved(127) As Byte
    End TypePrivate Const ATTR_INVALID As Long = 0
    Private Const ATTR_READ_ERROR_RATE As Long = 1
    Private Const ATTR_THROUGHPUT_PERF As Long = 2
    Private Const ATTR_SPIN_UP_TIME As Long = 3
    Private Const ATTR_START_STOP_COUNT As Long = 4
    Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5
    Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6
    Private Const ATTR_SEEK_ERROR_RATE As Long = 7
    Private Const ATTR_SEEK_TIME_PERF As Long = 8
    Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9
    Private Const ATTR_SPIN_RETRY_COUNT As Long = 10
    Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11
    Private Const ATTR_POWER_CYCLE_COUNT As Long = 12
    Private Const PRE_FAILURE_WARRANTY As Long = &H1
    Private Const ON_LINE_COLLECTION As Long = &H2
    Private Const PERFORMANCE_ATTRIBUTE As Long = &H4
    Private Const ERROR_RATE_ATTRIBUTE As Long = &H8
    Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10
    Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20
    Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30
    Private Const INVALID_HANDLE_VALUE As Long = -1
    Private Const VER_PLATFORM_WIN32s As Long = 0
    Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
    Private Const VER_PLATFORM_WIN32_NT As Long = 2Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128
    End Type'===下续
      

  5.   

    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long
    Private Const CREATE_NEW As Long = 1
    Private Const GENERIC_READ As Long = &H80000000
    Private Const GENERIC_WRITE As Long = &H40000000
    Private Const FILE_SHARE_READ As Long = &H1
    Private Const FILE_SHARE_WRITE As Long = &H2
    Private Const OPEN_EXISTING  As Long = 3
    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 DeviceIoControl Lib "kernel32" _
        (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, _
        ByVal nInBufferSize As Long, lpOutBuffer As Any, _
        ByVal nOutBufferSize As Long, lpBytesReturned As Long, _
        ByVal lpOverlapped As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function CloseHandle Lib "kernel32" _
        (ByVal hObject As Long) As Long
    Private m_DiskInfo As IDSECTORPrivate Function OpenSMART(ByVal nDrive As Byte) As Long    Dim hSMARTIOCTL As Long
        Dim hd As String
        Dim VersionInfo As OSVERSIONINFO    hSMARTIOCTL = INVALID_HANDLE_VALUE
        VersionInfo.dwOSVersionInfoSize = Len(VersionInfo)
        GetVersionEx VersionInfo
        Select Case VersionInfo.dwPlatformId
            Case VER_PLATFORM_WIN32s
                OpenSMART = hSMARTIOCTL
            Case VER_PLATFORM_WIN32_WINDOWS
                'Version Windows 95 OSR2, Windows 98
                hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0)
            Case VER_PLATFORM_WIN32_NT
                'Windows NT, Windows 2000
                If nDrive < MAX_IDE_DRIVES Then
                    hd = "\\.\PhysicalDrive" & nDrive
                    hSMARTIOCTL = CreateFile(hd, GENERIC_READ Or GENERIC_WRITE, _
                    FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
                End If
        End Select
        OpenSMART = hSMARTIOCTLEnd FunctionPrivate Function DoIDENTIFY(ByVal hSMARTIOCTL As Long, _
        pSCIP As SENDCMDINPARAMS, pSCOP() As Byte, ByVal bIDCmd As Byte, _
        ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
        '-------------------------------------------------------------------
        pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE    pSCIP.irDriveRegs.bFeaturesReg = 0
        pSCIP.irDriveRegs.bSectorCountReg = 1
        pSCIP.irDriveRegs.bSectorNumberReg = 1
        pSCIP.irDriveRegs.bCylLowReg = 0
        pSCIP.irDriveRegs.bCylHighReg = 0    pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)    pSCIP.irDriveRegs.bCommandReg = bIDCmd
        pSCIP.bDriveNumber = bDriveNum
        pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE
        DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, _
            pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))End FunctionPrivate Function DoEnableSMART(ByVal hSMARTIOCTL As Long, _
        pSCIP As SENDCMDINPARAMS, pSCOP As SENDCMDOUTPARAMS, _
        ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
        '---------------------------------------------------------------------
        pSCIP.cBufferSize = 0
        pSCIP.irDriveRegs.bFeaturesReg = SMART_ENABLE_SMART_OPERATIONS
        pSCIP.irDriveRegs.bSectorCountReg = 1
        pSCIP.irDriveRegs.bSectorNumberReg = 1
        pSCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW
        pSCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI
        pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)
        pSCIP.irDriveRegs.bCommandReg = IDE_EXECUTE_SMART_FUNCTION
        pSCIP.bDriveNumber = bDriveNum    DoEnableSMART = CBool(DeviceIoControl(hSMARTIOCTL, DFP_SEND_DRIVE_COMMAND, _
            pSCIP, LenB(pSCIP) - 1, pSCOP, LenB(pSCOP) - 1, lpcbBytesReturned, 0))End FunctionPrivate Sub ChangeByteOrder(szString() As Byte, ByVal uscStrSize As Integer)
        Dim i As Integer
        Dim bTemp As Byte    For i = 0 To uscStrSize - 1 Step 2
            bTemp = szString(i)
            szString(i) = szString(i + 1)
            szString(i + 1) = bTemp
        Next i
    End SubPrivate Sub DisplayIdInfo(pids As IDSECTOR, pSCIP As SENDCMDINPARAMS, _
        ByVal bIDCmd As Byte, ByVal bDfpDriveMap As Byte, ByVal bDriveNum As Byte)
        '--------------------------------------------------------------------------
        ChangeByteOrder pids.sModelNumber, UBound(pids.sModelNumber) + 1
        ChangeByteOrder pids.sFirmwareRev, UBound(pids.sFirmwareRev) + 1
        ChangeByteOrder pids.sSerialNumber, UBound(pids.sSerialNumber) + 1
    End Sub'调用过程
    Public Function GetDiskInfo(ByVal nDrive As Byte) As Long
        Dim hSMARTIOCTL As Long
        Dim cbBytesReturned As Long
        Dim VersionParams As GETVERSIONOUTPARAMS
        Dim scip As SENDCMDINPARAMS
        Dim scop() As Byte
        Dim OutCmd As SENDCMDOUTPARAMS
        Dim bDfpDriveMap As Byte
        Dim bIDCmd As Byte
        Dim uDisk As IDSECTOR    m_DiskInfo = uDisk
        
        hSMARTIOCTL = OpenSMART(nDrive)
        If hSMARTIOCTL <> INVALID_HANDLE_VALUE Then
            Call DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION, ByVal 0, 0, _
                VersionParams, Len(VersionParams), cbBytesReturned, 0)        If Not (VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10) Then
                If DoEnableSMART(hSMARTIOCTL, scip, OutCmd, nDrive, cbBytesReturned) Then
                    bDfpDriveMap = bDfpDriveMap Or 2 ^ nDrive
                End If
            End If
            bIDCmd = IIf((VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10), _
                IDE_ATAPI_ID, IDE_ID_FUNCTION)        ReDim scop(LenB(OutCmd) + IDENTIFY_BUFFER_SIZE - 1) As Byte
            If DoIDENTIFY(hSMARTIOCTL, scip, scop, bIDCmd, nDrive, cbBytesReturned) Then
                CopyMemory m_DiskInfo, scop(LenB(OutCmd) - 4), LenB(m_DiskInfo)
                Call DisplayIdInfo(m_DiskInfo, scip, bIDCmd, bDfpDriveMap, nDrive)
                CloseHandle hSMARTIOCTL
                GetDiskInfo = 1
                Exit Function
            End If
            CloseHandle hSMARTIOCTL
            GetDiskInfo = 0
          Else
            GetDiskInfo = -1
        End If
    End Function'硬盘生产厂/型号
    Public Property Get pSerialNumber() As String
        pSerialNumber = Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode))
    End Property'硬盘序列号
    Public Property Get pModelNumber() As String
        pModelNumber = Trim(StrConv(m_DiskInfo.sModelNumber, vbUnicode))
    End Property
      

  6.   

    谢以上各位了,测试了一下,我用以下语句调用时怎么出现提示“No physical disk 0 exist ”Private Sub Command1_Click()
       Dim hdi As CDiskInfo
       Set hdi = New CDiskInfo
       If (hdi.GetDiskInfo(0) = 1) Then
           Label1.Caption = hdi.pSerialNumber   '硬盘序列号
           Label2.Caption = hdi.pModelNumber '生产厂家/型号
       Else 
           MsgBox "No Physical Disk 0 exist."
       End If
    End Sub
    还请大侠指教啊!
      

  7.   

    巴顿研究过如何得到IDE硬盘的特征字(用VC好办),到东热找他
      

  8.   

    这种方法并不适用所有的硬盘。还可以调用主板序列号。
    到这儿看看:http://www.csdn.net/cnshare/soft/9/9091.shtm
      

  9.   

    有些硬盘和cpu没有序列号;某些主板的序列号读取方法没有公布,网卡就更不可取了。
      

  10.   

    '--------------------------------------------------------------------------
    '   类模块:  CDiskInfo.cls         (注:类模块名字绝对,不能更换)
    '   功能说明:获取硬盘序列号、生产厂家/型号
    '             支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000
    '             在Win9X下必须保证 System\Iosubsys目录下存在 smartvsd.vxd
    '             smartvsd.VXD在98第二版安装盘的 WIN98_62.CAB文件中
    ' 根据VC源码:从 Ring 3 获取 Ring 0 特权,读取硬盘序列号的代码整理
    '       原作:BARDO'
    '--------------------------------------------------------------------------
    '##########################################################################
    '调用方法:'Private Sub Form_Load()
        'Dim hdi As CDiskInfo
        'Set hdi = New CDiskInfo
        'hdi.GetDiskInfo 0
        
        '--------------------------------------
        '返回:
        '硬盘序列号: hdi.pSerialNumber
        '生产厂家/型号: hdi.pModelNumber
        '--------------------------------------
        
    'End Sub
    '###########################################################################
    Option ExplicitPrivate Const MAX_IDE_DRIVES As Long = 4
    Private Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512
    Private Const IDENTIFY_BUFFER_SIZE As Long = 512
    Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512
    Private Const DFP_GET_VERSION As Long = &H74080
    Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084
    Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088Private Type GETVERSIONOUTPARAMS
        bVersion As Byte
        bRevision As Byte
        bReserved As Byte
        bIDEDeviceMap As Byte
        fCapabilities As Long
        dwReserved(3) As Long
    End TypePrivate Const CAP_IDE_ID_FUNCTION As Long = 1
    Private Const CAP_IDE_ATAPI_ID As Long = 2
    Private Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4Private Type IDEREGS
        bFeaturesReg As Byte
        bSectorCountReg As Byte
        bSectorNumberReg As Byte
        bCylLowReg As Byte
        bCylHighReg As Byte
        bDriveHeadReg As Byte
        bCommandReg As Byte
        bReserved As Byte
    End TypePrivate Type SENDCMDINPARAMS
        cBufferSize As Long
        irDriveRegs As IDEREGS
        bDriveNumber As Byte
        bReserved(2) As Byte
        dwReserved(3) As Long
        bBuffer(0) As Byte
    End TypePrivate Const IDE_ATAPI_ID As Long = &HA1
    Private Const IDE_ID_FUNCTION As Long = &HEC
    Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0
    Private Const SMART_CYL_LOW As Long = &H4F
    Private Const SMART_CYL_HI As Long = &HC2Private Type DRIVERSTATUS
        bDriverError As Byte
        bIDEStatus As Byte
        bReserved(1) As Byte
        dwReserved(1) As Long
    End TypePrivate Const SMART_NO_ERROR As Long = 0
    Private Const SMART_IDE_ERROR As Long = 1
    Private Const SMART_INVALID_FLAG As Long = 2
    Private Const SMART_INVALID_COMMAND As Long = 3
    Private Const SMART_INVALID_BUFFER As Long = 4
    Private Const SMART_INVALID_DRIVE As Long = 5
    Private Const SMART_INVALID_IOCTL As Long = 6
    Private Const SMART_ERROR_NO_MEM As Long = 7
    Private Const SMART_INVALID_REGISTER As Long = 8
    Private Const SMART_NOT_SUPPORTED As Long = 9
    Private Const SMART_NO_IDE_DEVICE As Long = 10Private Type SENDCMDOUTPARAMS
        cBufferSize As Long
        drvStatus As DRIVERSTATUS
        bBuffer(0) As Byte
    End TypePrivate Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0
    Private Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1
    Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2
    Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3
    Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4
    Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8
    Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9
    Private Const SMART_RETURN_SMART_STATUS As Long = &HDAPrivate Type DRIVEATTRIBUTE
        bAttrID As Byte
        wStatusFlags As Integer
        bAttrValue As Byte
        bWorstValue As Byte
        bRawValue(5) As Byte
        bReserved As Byte
    End TypePrivate Type ATTRTHRESHOLD
        bAttrID As Byte
        bWarrantyThreshold As Byte
        bReserved(9) As Byte
    End TypePrivate Type IDSECTOR
        wGenConfig As Integer
        wNumCyls As Integer
        wReserved As Integer
        wNumHeads As Integer
        wBytesPerTrack As Integer
        wBytesPerSector As Integer
        wSectorsPerTrack As Integer
        wVendorUnique(2) As Integer
        sSerialNumber(19) As Byte
        wBufferType As Integer
        wBufferSize As Integer
        wECCSize As Integer
        sFirmwareRev(7) As Byte
        sModelNumber(39) As Byte
        wMoreVendorUnique As Integer
        wDoubleWordIO As Integer
        wCapabilities As Integer
        wReserved1 As Integer
        wPIOTiming As Integer
        wDMATiming As Integer
        wBS As Integer
        wNumCurrentCyls As Integer
        wNumCurrentHeads As Integer
        wNumCurrentSectorsPerTrack As Integer
        ulCurrentSectorCapacity(3) As Byte
        wMultSectorStuff As Integer
        ulTotalAddressableSectors(3) As Byte
        wSingleWordDMA As Integer
        wMultiWordDMA As Integer
        bReserved(127) As Byte
    End TypePrivate Const ATTR_INVALID As Long = 0
    Private Const ATTR_READ_ERROR_RATE As Long = 1
    Private Const ATTR_THROUGHPUT_PERF As Long = 2
    Private Const ATTR_SPIN_UP_TIME As Long = 3
    Private Const ATTR_START_STOP_COUNT As Long = 4
    Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5
    Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6
    Private Const ATTR_SEEK_ERROR_RATE As Long = 7
    Private Const ATTR_SEEK_TIME_PERF As Long = 8
    Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9
    Private Const ATTR_SPIN_RETRY_COUNT As Long = 10
    Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11
    Private Const ATTR_POWER_CYCLE_COUNT As Long = 12
    Private Const PRE_FAILURE_WARRANTY As Long = &H1
    Private Const ON_LINE_COLLECTION As Long = &H2
    Private Const PERFORMANCE_ATTRIBUTE As Long = &H4
    Private Const ERROR_RATE_ATTRIBUTE As Long = &H8
    Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10
    Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20
    Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30
    Private Const INVALID_HANDLE_VALUE As Long = -1
    Private Const VER_PLATFORM_WIN32s As Long = 0
    Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
    Private Const VER_PLATFORM_WIN32_NT As Long = 2
      

  11.   


    Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128
    End TypePrivate Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long
    Private Const CREATE_NEW As Long = 1
    Private Const GENERIC_READ As Long = &H80000000
    Private Const GENERIC_WRITE As Long = &H40000000
    Private Const FILE_SHARE_READ As Long = &H1
    Private Const FILE_SHARE_WRITE As Long = &H2
    Private Const OPEN_EXISTING  As Long = 3
    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 DeviceIoControl Lib "kernel32" _
        (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, _
        ByVal nInBufferSize As Long, lpOutBuffer As Any, _
        ByVal nOutBufferSize As Long, lpBytesReturned As Long, _
        ByVal lpOverlapped As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function CloseHandle Lib "kernel32" _
        (ByVal hObject As Long) As Long
    Private m_DiskInfo As IDSECTORPrivate Function OpenSMART(ByVal nDrive As Byte) As Long    Dim hSMARTIOCTL As Long
        Dim hd As String
        Dim VersionInfo As OSVERSIONINFO    hSMARTIOCTL = INVALID_HANDLE_VALUE
        VersionInfo.dwOSVersionInfoSize = Len(VersionInfo)
        GetVersionEx VersionInfo
        Select Case VersionInfo.dwPlatformId
            Case VER_PLATFORM_WIN32s
                OpenSMART = hSMARTIOCTL
            Case VER_PLATFORM_WIN32_WINDOWS
                'Windows 95 OSR2, Windows 98
                hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0)
            Case VER_PLATFORM_WIN32_NT
                'Windows NT, Windows 2000
                If nDrive < MAX_IDE_DRIVES Then
                    hd = "\\.\PhysicalDrive" & nDrive
                    hSMARTIOCTL = CreateFile(hd, GENERIC_READ Or GENERIC_WRITE, _
                    FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
                End If
        End Select
        OpenSMART = hSMARTIOCTLEnd FunctionPrivate Function DoIDENTIFY(ByVal hSMARTIOCTL As Long, _
        pSCIP As SENDCMDINPARAMS, pSCOP() As Byte, ByVal bIDCmd As Byte, _
        ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
        '-------------------------------------------------------------------
        pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE    pSCIP.irDriveRegs.bFeaturesReg = 0
        pSCIP.irDriveRegs.bSectorCountReg = 1
        pSCIP.irDriveRegs.bSectorNumberReg = 1
        pSCIP.irDriveRegs.bCylLowReg = 0
        pSCIP.irDriveRegs.bCylHighReg = 0    pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)    pSCIP.irDriveRegs.bCommandReg = bIDCmd
        pSCIP.bDriveNumber = bDriveNum
        pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE
        DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, _
            pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))End FunctionPrivate Function DoEnableSMART(ByVal hSMARTIOCTL As Long, _
        pSCIP As SENDCMDINPARAMS, pSCOP As SENDCMDOUTPARAMS, _
        ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
        '---------------------------------------------------------------------
        pSCIP.cBufferSize = 0
        pSCIP.irDriveRegs.bFeaturesReg = SMART_ENABLE_SMART_OPERATIONS
        pSCIP.irDriveRegs.bSectorCountReg = 1
        pSCIP.irDriveRegs.bSectorNumberReg = 1
        pSCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW
        pSCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI
        pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)
        pSCIP.irDriveRegs.bCommandReg = IDE_EXECUTE_SMART_FUNCTION
        pSCIP.bDriveNumber = bDriveNum    DoEnableSMART = CBool(DeviceIoControl(hSMARTIOCTL, DFP_SEND_DRIVE_COMMAND, _
            pSCIP, LenB(pSCIP) - 1, pSCOP, LenB(pSCOP) - 1, lpcbBytesReturned, 0))End FunctionPrivate Sub ChangeByteOrder(szString() As Byte, ByVal uscStrSize As Integer)
        Dim i As Integer
        Dim bTemp As Byte    For i = 0 To uscStrSize - 1 Step 2
            bTemp = szString(i)
            szString(i) = szString(i + 1)
            szString(i + 1) = bTemp
        Next i
    End SubPrivate Sub DisplayIdInfo(pids As IDSECTOR, pSCIP As SENDCMDINPARAMS, _
        ByVal bIDCmd As Byte, ByVal bDfpDriveMap As Byte, ByVal bDriveNum As Byte)
        '--------------------------------------------------------------------------
        ChangeByteOrder pids.sModelNumber, UBound(pids.sModelNumber) + 1
        ChangeByteOrder pids.sFirmwareRev, UBound(pids.sFirmwareRev) + 1
        ChangeByteOrder pids.sSerialNumber, UBound(pids.sSerialNumber) + 1
    End Sub'调用过程:GetDiskInfo 0    磁盘序列,从 0 开始
    Public Function GetDiskInfo(ByVal nDrive As Byte) As Long
        Dim hSMARTIOCTL As Long
        Dim cbBytesReturned As Long
        Dim VersionParams As GETVERSIONOUTPARAMS
        Dim scip As SENDCMDINPARAMS
        Dim scop() As Byte
        Dim OutCmd As SENDCMDOUTPARAMS
        Dim bDfpDriveMap As Byte
        Dim bIDCmd As Byte
        Dim uDisk As IDSECTOR    m_DiskInfo = uDisk
        
        hSMARTIOCTL = OpenSMART(nDrive)
        If hSMARTIOCTL <> INVALID_HANDLE_VALUE Then
            Call DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION, ByVal 0, 0, _
                VersionParams, Len(VersionParams), cbBytesReturned, 0)        If Not (VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10) Then
                If DoEnableSMART(hSMARTIOCTL, scip, OutCmd, nDrive, cbBytesReturned) Then
                    bDfpDriveMap = bDfpDriveMap Or 2 ^ nDrive
                End If
            End If
            bIDCmd = IIf((VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10), _
                IDE_ATAPI_ID, IDE_ID_FUNCTION)        ReDim scop(LenB(OutCmd) + IDENTIFY_BUFFER_SIZE - 1) As Byte
            If DoIDENTIFY(hSMARTIOCTL, scip, scop, bIDCmd, nDrive, cbBytesReturned) Then
                CopyMemory m_DiskInfo, scop(LenB(OutCmd) - 4), LenB(m_DiskInfo)
                Call DisplayIdInfo(m_DiskInfo, scip, bIDCmd, bDfpDriveMap, nDrive)
                CloseHandle hSMARTIOCTL
                GetDiskInfo = 1
                Exit Function
            End If
            CloseHandle hSMARTIOCTL
            GetDiskInfo = 0
          Else
            GetDiskInfo = -1
        End If
    End Function'硬盘生产厂/型号
    Public Property Get pSerialNumber() As String
        pSerialNumber = Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode))
    End Property'硬盘序列号
    Public Property Get pModelNumber() As String
        pModelNumber = Trim(StrConv(m_DiskInfo.sModelNumber, vbUnicode))
    End Property
      

  12.   

    用以上代码试了一下,无法得到硬盘序列号和硬盘生产厂/型号,我这样调用的:Private Sub Command1_Click()
       Dim hdi As CDiskInfo
       Set hdi = New CDiskInfo
       Label1.Caption = hdi.pSerialNumber   '硬盘序列号
       Label2.Caption = hdi.pModelNumber    '生产厂家/型号
    End Sub结果没有任何显示,也没出错。请高手指教。
      

  13.   

    我用的是win me系统,是否跟系统版本有关?