老板让我用VB做一个小软件,安装在任何一台机器上第一次运行该程序时需要一个注册码,不同的机器需要不同的注册码,请问如何实现这个功能,请赐教 !!!很急,很急 ............................ 急 !!!!!!!!!!

解决方案 »

  1.   


     featherfly(羽毛飞呀飞) 你好,能说的详细些么?能否给出源代码?感激不尽 !!!
      

  2.   


    用VB为软件增加注册功能
    在尊重软件著作权的时代,电子注册版软件的应用也越来越广。它的出现使用户对程序中未受限制的功能有了一定了解,起到了推广和传播作用,同时也很好地保护了制作人的切身利益。那么,我们如何制作一个电子注册版软件呢?   经过摸索,笔者利用VB也简单地制作了一个电子注册版软件。   设计原理 
      利用API中的“GetVolumeInformation”函数提取使用者机器的硬盘序列号为特征码,注册时提交此码,经过软件著作权人加以运算,给出注册码,最后软件使用人输入注册码完成整个注册过程(为使说明简单,本例中以特征码减101做为注册码)。   新建一模块文件 
      新建一模块文件,并将如下声明的语句和常量添加到Module1.Bas模块中:   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 Long   Global GetVal As Long   编程时需注意的是要将声明语句写在同一行中。   窗体设置 
      在Form1上添加2个文本框,Name属性分别设置为Text1、Text2;再添加1个按钮,Name属性设置为Command1。   添加代码 
      将如下程序代码添加到Form1的Form1_Load事件中:   Private Sub Form_Load()   Dim TempStr1 As String * 256   Dim TempStr2 As String * 256   Dim TempLon1 As Long   Dim TempLon2 As Long   ………   ‘读取是否注册的信息,如何控制这里不再说明   ………   Call GetVolumeInformation("C:", TempStr1, 256, GetVal, TempLon1, TempLon2, TempStr2, 256)   Text1.Text = GetVal ‘提取本机C盘的序列号至文本框一   End Sub   将如下程序代码添加到Command1的Command1_Click事件中:   Private Sub Command1_Click()   If Text2 〈〉 CStr(GetVal) Then   MsgBox "注册码不正确,请认真检查输入是否正确。"   Else   MsgBox "你已经成功注册,请重新启动本软件。"   ………   (将正确注册的信息写入,使软件功能以后不受限制。具体方法依个人爱好进行设置。)   ………   End If   End Sub   至此,我们可以运行一下程序。你会发现我们已经简单地实现了利用硬盘序列号制作电子注册版软件的功能。
      

  3.   


    用VB为软件增加注册功能
    在尊重软件著作权的时代,电子注册版软件的应用也越来越广。它的出现使用户对程序中未受限制的功能有了一定了解,起到了推广和传播作用,同时也很好地保护了制作人的切身利益。那么,我们如何制作一个电子注册版软件呢?   经过摸索,笔者利用VB也简单地制作了一个电子注册版软件。   设计原理 
      利用API中的“GetVolumeInformation”函数提取使用者机器的硬盘序列号为特征码,注册时提交此码,经过软件著作权人加以运算,给出注册码,最后软件使用人输入注册码完成整个注册过程(为使说明简单,本例中以特征码减101做为注册码)。   新建一模块文件 
      新建一模块文件,并将如下声明的语句和常量添加到Module1.Bas模块中:   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 Long   Global GetVal As Long   编程时需注意的是要将声明语句写在同一行中。   窗体设置 
      在Form1上添加2个文本框,Name属性分别设置为Text1、Text2;再添加1个按钮,Name属性设置为Command1。   添加代码 
      将如下程序代码添加到Form1的Form1_Load事件中:   Private Sub Form_Load()   Dim TempStr1 As String * 256   Dim TempStr2 As String * 256   Dim TempLon1 As Long   Dim TempLon2 As Long   ………   ‘读取是否注册的信息,如何控制这里不再说明   ………   Call GetVolumeInformation("C:", TempStr1, 256, GetVal, TempLon1, TempLon2, TempStr2, 256)   Text1.Text = GetVal ‘提取本机C盘的序列号至文本框一   End Sub   将如下程序代码添加到Command1的Command1_Click事件中:   Private Sub Command1_Click()   If Text2 〈〉 CStr(GetVal) Then   MsgBox "注册码不正确,请认真检查输入是否正确。"   Else   MsgBox "你已经成功注册,请重新启动本软件。"   ………   (将正确注册的信息写入,使软件功能以后不受限制。具体方法依个人爱好进行设置。)   ………   End If   End Sub   至此,我们可以运行一下程序。你会发现我们已经简单地实现了利用硬盘序列号制作电子注册版软件的功能。
      

  4.   

    也可以用Guid,哈哈哈,那个不会重复,把Guid用一个编码或加密算法进行编码
      

  5.   

    能给我一份嘛??
    [email protected]
      

  6.   

    LCAAA(小小程序员) :
    还有我,给我也发一份,[email protected]
    大家学习学习,谢谢!!
      

  7.   

    俺也要,谢谢~
    [email protected]
      

  8.   

    ME TOO!
    [email protected]
      

  9.   

    Option Explicit'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文件中
    '--------------------------------------------------------------------------
    '################################################################################
    '窗体中的调用方法:
    'Option Explicit'Private hdi As CDiskInfo'Private Sub Form_Load()
        'Set hdi = New CDiskInfo
        'hdi.GetDiskInfo 0
        '硬盘序列号: hdi.pSerialNumber
        '生产厂家/型号: hdi.pModelNumber
    'End Sub
    '################################################################################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 = 2
      

  10.   

    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
                '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