从我们接触软件到现在,我们使用过各式各样的软件,有的需要注册码、有试用期的(到期必须激活或者购买)、有的限制使用次数的、也有免费使用的。现在客户就向我们提出这样的需求,要给软件设定一个使用期限。查了很多资料后,我们总结了一下实现这个功能的几个想法。
一、思路
前提:如果用户更改了系统时间使用时间的限制就会失效
1、将注册的时间写入到注册表,每次登录进行验证
2、将注册时间写入到本地的文件中,如xml、文本文件、.DLL、int文件。
3、使用一个Timer控件,将每次使用的时间总值记录下来,在每次退出程序时将时间值自动保存到txt文本中,此文本可以隐藏到到系统文件中,然后每次启动程序时,程序自动提取该文件时间,并与规定时间作对比,然后使用if语句来进行或终止程序。如果说用户几天不使用此软件,则这种方法就对于使用天数的限制就不可取。
二、实现
VB中有很大的篇幅介绍文件的处理,讲述不同类型文件相同的处理步骤:
(1)首先用open语句打开或建立文件,如果文件存在就,则打开文件,如果不存在,则建立文件。
(2)将文件找那个的数据读取到变量中
(3)使用和处理变量中的数据
(4)将变量中的数据写到文件中
(5)使用Close语句关闭文件
1、 VB实例(写入到注册表中)
<span style="font-size:18px;"> PrivateSub Form_Load()
Dim t As Date
t =CDate(Date) '获取当前日期
'计算使用天数,d小于等于0时
IfDateDiff("d", t,"2009-09-20") <= 0 Then
MsgBox "对不起,该软件到期,您只能用到2009-09-20日",, "过期"
SaveSetting "", "","", 8
UnloadMe
End If
IfDateDiff("d", t,"2009-09-20") > 0 Then
If GetSetting("","", "") = 8 Then
MsgBox "修改时间无效!", , "已过期"
Unload Me
End If
End If
End Sub</span>
注:
(1) savesetting:将一个值存储到注册表里
例:SaveSetting"工程主题","主键名","键名","键值"
(2)GetSetting 这个函数的返回值就是获取的注册表的键值
例:GetSetting"工程主题","主键名","键名","默认键值" '默认键值,当获取为空,或不成功时返回默认值
2、VB.NET 实例(写入到文件中)
(1)封装好的文件
<span style="font-size:18px;">Imports System.IO
PublicClass CodeSet
'/ <summary>
'/ 写文件到指定目录,如果文件存在则先删除
'/ </summary>
'/<paramname="strName"></param>
'/<paramname="strContent"></param>
'/<returns></returns>
Public FunctionWriteCode(ByVal strName AsString, ByVal strContent As String) As Boolean
'初始化boolean变量
Dim result As Boolean = False
'封装.dll生成路径
Dim filepath As String ="C:\\WINDOWS\\system32\\" + strName
Try
'如果存在此文件则删除
If File.Exists(filepath) Then
File.Delete(filepath)
End If
'创建新的".DLL"文件,FileCode指定操作系统打开
Dim FS As FileStream = NewFileStream(filepath, FileMode.CreateNew)
'BinaryWriter以二进制形式将基元类型写入流,并支持以特定的编码写入字符串
Dim BW As BinaryWriter = NewBinaryWriter(FS, System.Text.Encoding.Unicode)
'将注册时间和天数写入到数据库
BW.Write(strContent)
'记住,操作完成后及时关闭Bw, As BW.Close()
FS.Close()
result = True
'加密
'file.Encrypt("C:\\Windows\\System32\\"+ strName)
Catch
result = False
End Try
Return result
End Function
'/ <summary>
'/ read content from yourpath,return thecontent
'/ </summary>
'/<paramname="strName"></param>
'/<returns></returns>
'/<remarks></remarks>
Public FunctionReadCode(ByVal strName AsString) As String
Dim strContent As String
'从此文件夹下读取
Dim filepath As String ="C:\\WINDOWS\\system32\\" + strName
'如果文件不存在,返回空
If Not File.Exists(filepath) Then
Return ""
End If
Dim FS As FileStream = NewFileStream(filepath, FileMode.Open)
Dim BR As BinaryReader = NewBinaryReader(FS, System.Text.Encoding.Unicode)
'读取文件
strContent = BR.ReadString()
'记住,操作完成后及时关闭Bw, AsBR.Close()
FS.Close()
Return strContent
End Function
EndClass</span>
(2)写入和读取文件
<span style="font-size:18px;">Partial Public ClassFrmUseTime
Inherits Form
Private rs As CodeSet=New CodeSet() '实例化要写入注册时间的codeset
''' <summary>
'''写入注册日期
''' </summary>
'''<paramname="sender"></param>
'''<paramname="e"></param>
'''<remarks></remarks>
Private SubbtnWrite_Click(sender AsObject, e As EventArgs) Handles btnWrite.Click
'实例化boolean型变量
Dim result As Boolean
'将当前日期写入到“limit.dll”已经封装好的dll中;当前日期、注册日期和天数用“*”进行分隔
result =rs.WriteCode("limit.dll", DateTime.Now.ToString() +"*" +DateTime.Now.ToString() + "*" + txtTime.Text.ToString+"*")
'如果返回结果为true,则写入成功
If (result) Then
lbs.Text = "写入<使用期信息>成功"
Else '若不成功,则写入失败
lbs.Text = "写入<使用期信息>失败"
End If
End Sub
''' <summary>
''' 每次登陆时去比较
''' </summary>
'''<paramname="sender"></param>
''' <paramname="e"></param>
'''<remarks></remarks>
Private SubbtnRead_Click(sender As Object,e As EventArgs) Handles btnRead.Click
'用来显示注册日期、当前日期、天数
lstLimit.Items.Clear()
Dim result() As String
Try
'读取封装好的limit.dll,切分文件
result =rs.ReadCode("limit.dll").Split("*"c)
'将结果读取到相应的容器中
lstLimit.Items.AddRange(result)
lbs.Text = "读取<使用期信息>成功"
Catch
lbs.Text = "读取<使用期信息>失败"
End Try
End Sub
End Class</span>
三、System.IO
System.IO命名空间中的封装类用来读写基于字符、二进制、字符串、内存的各种数据存储内容的方法。
类名 | 描述 |
BinaryReader | 以二进制值读取基本数据类型(整型、布尔型、字符串型和其他类型) |
BinaryWriter | 以二进制值存储基本数据类型(整型、布尔型、字符串型和其他类型) |
BufferedStream | 为字节流提供临时存储空间,允许以后提交 |
Directory | 通过静态方法实现操作计算机的目录结构 |
DirectoryInfo | 通过一个有效的对象变量来实现操作计算机的目录结构 |
File | 通过静态方法实现操作计算机上的一组文件 |
FileInfo | 通过一个有效的对象变量来实现操作计算机上的一组文件 |
FileStream | 实现文件随机访问(如寻址能力),并以字节流来表示数据 |
1、BinaryWriter类,在继承时,对Write()方法进行重载,并使用Write()方法将数据写入到文本文件中。
2、BinaryReader类,与BinaryWriter类一样,也从System.Object直接派生,与BinaryWriter类具有相同的特性。
3、BufferedStream类,用来输出缓冲区内的字节块,它提供从基础数据源或储存库读取字节以及将字节写入基础数据源或储存库的实现。 BufferedStream提供了 BinaryReader类和BinaryWriter类对文本文件进行读取和写入。BufferedStream用于在不需要缓冲区时防止缓冲区降低输入和输出速度。
4、FileInfo类,它可以获取文件的创建时间、大小等信息,在FileInfo类中提供了许多成员,以方便开发人员来操作硬盘上的文件。
5、File类,提供了AppendText()、Create()、CreateText()、Open()、OpenRead()、OpenWrite()和OpenText()方法。在大多数情况下,File类和FileInfo类能互换使用。下表列出了File类中的常用方法。
6、FileStream类,一个相当原始的流,它只能读取或写入一个字节或字节数组。而且此流还提供了Stream包装类,它们可以更方便地处理文本数据和.NET类型。因为,FileStream只能处理原始字节,在使用时必须把System.String编码成相应的字节数组。但是System.Text命名空间定义了一个Encoding类型,它提供了一些成员,来实现在字符串和字节数组之间的编码/解码操作。