利用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 
  至此,我们可以运行一下程序。你会发现我们已经简单地实现了利用硬盘序列号制作电子注册版软件的功能。

解决方案 »

  1.   

    GetVolumnInformation获得的是硬盘的卷名称而不是序列号,如果硬盘格式化了那么用户就不能再用了,因为卷标改变了。
      

  2.   

    ferrytang(丐帮帮助) 知道了
      

  3.   

    GetVolumeInformation函数确实可以获得一个磁盘的序列号,而这个序列号是固定不变的。以下是说明,具体的使用方法如tanaya(蜡笔小新)所述VB声明 
    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 
    说明 
    获取与一个磁盘卷有关的信息 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数                      类型及说明 
    lpRootPathName            String,欲获取信息的那个卷的根路径 lpVolumeNameBuffer        String,用于装载卷名(卷标)的一个字串 nVolumeNameSize           Long,lpVolumeNameBuffer字串的长度 lpVolumeSerialNumber      Long,用于装载磁盘卷序列号的变量 lpMaximumComponentLength  Long,指定一个变量,用于装载文件名每一部分的长度。例如,在“c:\component1\component2.ext”的情况下,它就代表component1或component2名称的长度 lpFileSystemFlags         Long,用于装载一个或多个二进制位标志的变量。对这些标志位的解释如下: 
    FS_CASE_IS_PRESERVED 文件名的大小写记录于文件系统 
    FS_CASE_SENSITIVE 文件名要区分大小写 
    FS_UNICODE_STORED_ON_DISK 文件名保存为Unicode格式 
    FS_PERSISTANT_ACLS 文件系统支持文件的访问控制列表(ACL)安全机制 
    FS_FILE_COMPRESSION 文件系统支持逐文件的进行文件压缩 
    FS_VOL_IS_COMPRESSED 整个磁盘卷都是压缩的 lpFileSystemNameBuffer    String,指定一个缓冲区,用于装载文件系统的名称(如FAT,NTFS以及其他) nFileSystemNameSize       Long,lpFileSystemNameBuffer字串的长度 
      

  4.   

    楼上说的的确是磁盘序列号,而非磁盘id,一个磁盘只有一个id直至他的生命结束,而序列号有好多,每次格式化都会产生一个新序列号,你若将一个硬盘分成4个分区,每个分区都有一个序列号。