引自陈建华 Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongPublic Type SerHdInfo strLabel As String strType As String serNum As String End TypePublic Function GetSerialNumber(sRoot As String) As SerHdInfo Dim lSerialNum As Long Dim R As Long Dim RevVal As SerHdInfo
http://www.21tx.com/src/vb/
在这里,作者提供了获得CPU序列号和网卡Mac地址的方法。
1.Delphi中可这个控件或这个动态库。控件提供了两个属性,MacAddress和CPUSerialNumber。
2.Delphi外的语言,请使用这个动态库。动态库提供了两个函数,GetCPUSerialNumber和GetMacAddress
这些函数和控件,在win2000和winXP中测试通过,在多CPU、多硬盘、使用了并列存储技术的大型服务器上,也测试通过。
在软件保护中,我们常常要用到机器的标识。根据作者的经验,在好些服务器上无法取得硬盘序列号。特别是在那些使用了并列存储技术或做了镜象的硬盘。网卡也容易更换,因此作者建议使用CPU序列号。
在同一个压缩包里,还有一个注册码例子程序,演示如何用注册码对软件进行保护!(含delphi源程序)下载的地址是:http://www.herozhan.com/down.asp?id=468&no=1
Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongPublic Type SerHdInfo
strLabel As String
strType As String
serNum As String
End TypePublic Function GetSerialNumber(sRoot As String) As SerHdInfo
Dim lSerialNum As Long
Dim R As Long
Dim RevVal As SerHdInfo
RevVal.strLabel = String$(255, Chr$(0))
' 磁盘卷标
RevVal.strType = String$(255, Chr$(0))
' 文件系统类型
R = GetVolumeInformation(sRoot, strLabel, Len(strLabel), lSerialNum, 0, 0, strType, Len(strType))
RevVal.serNum = lSerialNum '序列号
GetSerialNumber = RevVal
End Function