找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1222|回复: 1

[讨论]:用VB+Access实现软件试用期

[复制链接]
发表于 2006-7-11 13:43:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
用VB+Access实现软件试用期


    大家都知道共享软件都有它们的试用期,即给你一个固定的期限免费使用,超出一定的期限免费使用。超出一定和期限如果你坚决拒付使用费的话,呵 呵,那个软件就不能启动了。你想不想也编一个带试用期的程序呢?不难,方法如下:
    编程思路
    应有的功能:
    1)给定一个试用期限,在系统每次启动时会判断软件已经使用了几天,还有几天可以及启动的次数。
    2)当系统日期被修改成往日的日期后,系统能自动判别,禁止修改日期 ,不予正常启动。
    3)当试用期到,显示信息,不予启动程序。
    大致算法
    1)在系统第一次运行时,在一个隐蔽的地方(如“c:windows\system")建立一个用以记录系统信息的数据库文件如 日期date.mdb,使用一张表date,有三个字段first_time,last_times。其中fitst_time,为系统第一次启动时和日期,即使用期的第一天。last_time为系统最近一次启动的时间,而times为记录系统启动的次数。
    2)系统每次启动会检测当前的日期同last_time做比较。如果当前和日期(如2000/09/30)比last_time(如2000/10/01)还归,说明系统的日期被推后,显示信息,不予启动系统。反之,则转入第三步。
    3)取出数据库中的first_time,同当前的日期做减法运算,看所用的天数是否在使用天数是否在使用期限内。如果在,则转入第四步,否则显示信息,不予启动系统。
    4)修改数据库的list_time字段为当前的日期,显示系统已经使 用的情况,正常启动系统。
    好了,只要大家把date.mdb藏好了,不被发现就万事大吉了。而且你可以给这个数据库加上密码,然后把first_time.last_time.times的字段改个面目全非,就算有高手发现了数据库,破解了密码,他也不知道这个数据库是哪个软件的文件 。
      程序源码
     在你的工程中,请以SUB main0启动程序。
    Sub maim()
    On ERROR GoTo error
    '系统检测是否有有date.mdb文件,如果没有,则是系统第一次启动。则建立之
    If Dir(c:\wimdows\system\date.mdb")=“”Then
    '注意在开始,你要确定工程引用了Mi-crosoft dao 2.5/3.5 compatibility library
    Dim WS As Workspace
    Dim DB As Database
    Dim TD As Tabledef
    Dim FLD As Field
    Dim IDX As Index
    Dim rd As Recordset
    Set WS=DBEngine.workspaces(0)
    set DB=Ws.CreateDatabase("c:\windows\system\date.mdb",dbLangGeneral)
    DB.Connect=";pwd=andy"
    set TD=Db.CreateTableDef("Date")
    TD.Attributes=0
    TD.Connect=""
    TD.SourceTableName=""
    TD.ValidationRule=""
    TD.ValidationText="" 'Fied first_time
    Set FLD =TD.CreateField("first_time",8,8)
      FLD.Attributes=1
      FLD.DefaultValue=""
      FLD.OrdinalPosition=0
      FLD.Required=False
      FLD.ValidationRule=""
      FLD.ValidationText=""
    TD.Fields.Append FLD 'Fied first_time
   Set FLD =TD.CreateField("last_time",8,8)
      FLD.Attributes=1
      FLD.DefaultValue=""
      FLD.OrdinalPosition=1
      FLD.Required=False
      FLD.ValidationRule=""
      FLD.ValidationText=""
    TD.Fields.Append FLD 'Fied first_time
   Set FLD =TD.CreateField("times",3,2)
      FLD.Attributes=1
      FLD.DefaultValue=""
      FLD.OrdinalPosition=2
      FLD.Required=False
      FLD.ValidationRule=""
      FLD.ValidationText=""
    TD.Fields.Append FLD
    DB.TableDefs.Append Td
    DB.Close
    set DB=Ws.OpenDatabase("c:\windows\system\date.mdb")
    Set rd=DB.OpenRecordset("date")
    With rd
        .AddNew
        .Fields("first_time")=Date
        .Fields("last_time")=Date
        .Fields("times")=1
        .Update
    end With
    DB.Close
    MsgBox"这是你第一次启动本系统!你的试用期为30天,今天是第一天,谢谢使用!",48,“木瓜软件工作室”
    效果图略。
    mainForm.Show '启动你和主窗体
    ELse '系统有dste.mdb文件,则不是第一次运行,就不用建立数据库文件了.
    Dim WS2 As Workspace
    Dim DB2 As Database
    Dim rd2 As Recordset
    Set WS2=Workspaces(0)
    Set DB2=Ws2.OpenDatabase("c:\windows\system\date.mdb",pwd="springlover")
    Set rd2=Db2.openRecordset("date")
      '开始检测用户是否修改了系统日期
    rd2.MoveFirst
    If rd2.fields("last_time")>Date then
    MsgBox"对不起,你在本软件的试用期骨不可以修改系统日期,否则将取消你地不系统的试用权,如果你想继续使用本软件。请你恢复系统日期,谢谢合作!",48,"木瓜软件工作室"
       End
      End If
    '开始检测是否超期
       If Date - rd2.Fields("first_time")>=30 Then`设定试用期为30天
     MsgBox"你已经启动本系统“@ rd2.Fields(times")@"而且已经到了30天的试用期如果你想继续使用本软件,请你到本公司注册并购买正版的软件!",48,"木瓜软件工作室"
    End
    Else
    '仍在试用期内
    num%=rd2.Fields("times")
    rd2.Edit
    rd2.Fields("last_time")=date
    rd2.Fields("times")=num+1
    rd2.Update
  MsgBox "这是你第”@ rd2.Fields("times")&"次使用本系统,你还有“@ 30-(Date-rd2.Fields("fitsr_time")@"天的试用期,祝你今天工件愉快!”,48,"木瓜软件工作室"
     mainForm.show '启动你的主窗体
       end if
     End if
     Exit sub
     error;
     msgbox"系统错误!”

     好了,终于编完了我们带试用期和。一般的高手会想到到注册表支修改或是恢复最初的注册表,但这都是无济于事的。而且这种方法还有一个重要的特点就是只难安装本系统一次,因为当卸载了原来的程序,想重新安装的时候,因为date.mdb仍然存在,所以就真正地控制了只能安装一闪,使 用30天的期限,是不是比DREAMWAVER还要附加一个小程序,删除那个数据库文件即可。


297、FSO对象模型在VB中的应用

    从 Visual Basic 的第一版至今,VB中有关文件的处理都是通过使用 Open 、Write以及其它一些相关的语句和函数来实现的。随着软件技术的不断发展,加上面向对象编程概念的日臻成熟,这些文件操作语句已经不能适应软件不断增加的复杂程度的需要了。因此,从VB6.0开始,微软提出了一个全新的文件系统对象FSO。

    一、简介
    文件系统对象FSO的英文全称是File System Object ,这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法。通过采用object.method这种在面向对象编程中广泛使用的语法,将一系列操作文件和文件夹的动作通过调用对象本身的属性直接实现。
FSO 对象模型不仅可以象使用传统文件操作语句那样实现文件的创建、改变、移动和删除,而且可以检测是否存在指定的文件夹,如果存在,那么,这个文件夹又位于磁盘上的什么位置。更令人高兴的是FSO 对象模型还可以获取关于文件和文件夹的信息,如名称、创建日期或最近修改日期等以及当前系统中使用的驱动器的信息,如驱动器的种类是CD-ROM还是可移动磁盘,当前磁盘的剩余空间还有多少。而以前要获取这些信息必须通过调用Windows API函数集中的相应函数才能实现。
     FSO对象模型包含在Scripting 类型库 (Scrrun.Dll)中,它同时包含了Drive、Folder、File、FileSystemObject和TextStream五个对象。其中Drive用来收集驱动器的信息,如可用磁盘空间或驱动器的类型;Folder用于创建、删除或移动文件夹,同时可以进行向系统查询文件夹的路径等操作;File的基本操作和Folder基本相同,所不同的是Files的操作主要是针对磁盘上的文件进行的;FileSystemObject是FSO对象模型中最主要对象,它提供了一套完整的可用于创建、删除文件和文件夹,收集驱动器、文件夹、文件相关信息的方法。需要注意的是,FSO对象模型提供的方法是冗余的,也就是说在实际使用中,FSO对象模型中包含的不同对象的不同方法进行的却是同样的操作,而且FileSystemObject对象的方法直接作用于其余对象,所以在后面的文章中并没有单独提到FileSystemObject对象,千万不要以为没有提到就不重要,事实上FileSystemObject对象在整个FSO对象模型中无处不在;最后的TextStream对象则是用来完成对文件的读写操作的。
    在初步了解了FSO对象模型之后,下面我们通过实际的代码对不同的对象进行进一步的阐述。

     二、FSO对象模型的应用
     (一)创建FSO对象模型
    由于FSO对象包含在Scripting 类型库 (Scrrun.Dll)中,所以在使用前首先需要在在工程中引用这个文件,单击“工程”,“引用”,然后在“引用”对话框中选中“Microsoft Scripting Runtime”前的复选框,然后单击“确定”。
要创建FSO对象可以采用两种方法,一种是将一个变量声明为FSO对象类型:Dim fsoTest As New FileSystemObject;另一种是通过CreateObject方法创建一个FSO 对象:Set fsoTest = CreateObject(“Scripting.FileSystemObject")。在实际使用中具体采用哪种声明方法,可根据个人的使用习惯而定。
完成了FSO对象模型的创建之后,就可以利用创建的对象模型的方法访问下属各个对象的属性来获取所需信息或进行相关操作了,具体的方法在下面结合各个对象分别讲述。

    (二)Drive对象
   上面已经提到Drive对象是用来获取当前系统中各个驱动器的信息的。由于Drive对象没有方法,其应用都是通过属性表现出来的,所以我们必须熟悉Drive对象的属性:
AvailableSpace:返回在指定的驱动器或网络共享上的用户可用的空间容量。
DriveLetter :返回某个指定本地驱动器或网络驱动器的字母,这个属性是只读的。
DriveType:返回指定驱动器的磁盘类型。
FileSystem: 返回指定驱动器使用的文件系统类型。
FreeSpace:返回指定驱动器上或共享驱动器可用的磁盘空间,这个属性是只读的。
IsReady:确定指定的驱动器是否准备好。
Path :返回指定文件、文件夹、或驱动器的路径。
RootFolder :返回一个 Folder 对象,该对象表示一个指定驱动器的根文件夹。只读属性。
SerialNumber:返回用于唯一标识磁盘卷标的十进制序列号。
ShareName:返回指定驱动器的网络共享名
TotalSize :以字节为单位,返回驱动器或网络共享的总空间大小。
VolumeName :设置或返回指定驱动器的卷标名。
     从上面的属性可以看到Drive对象基本上包含了日常操作所需的全部的驱动器信息,因此在使用中是非常方便的。下面通过一个实例讲述Drive对象的使用。首先在VB中建立一个工程,然后添加一个命令按钮,将其Caption设置为“TestDrive”,然后在click事件中加入以下代码:
Dim fsoTest As New FileSystemObject
Dim drv1 As Drive, sReturn As String
Set drv1 = fsoTest.GetDrive(“C:\")
sReturn = “Drive " & “C:\" & vbCrLf
sReturn = sReturn & “VolumeName" & drv1.VolumeName & vbCrLf
sReturn = sReturn & “Total Space: " & FormatNumber(drv1.TotalSize / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
sReturn = sReturn & “Free Space: " & FormatNumber(drv1.FreeSpace / 1024, 0)
sReturn = sReturn &“Kb" & vbCrLf
sReturn = sReturn &“FileSystem:" & drv1.FileSystem & vbCrLf
MsgBox sReturn
     其中GetDrive方法返回一个与指定路径中的驱动器相对应的 Drive 对象。该方法的语法格式为object.GetDrive drivespec,object是一个FSO对象的名称,drivespec用于指定驱动器的名称。
    按F5运行上述代码,按下TestDrive按钮就会弹出一个消息框显示C盘的信息。

    (三)Folder对象
    在FSO 对象模型中,提供了丰富的有关文件夹操作的方法,这些方法分别是:
FileSystemObject对象有关文件夹的方法:
CreateFolder :创建一个文件夹 。
DeleteFolder:删除一个文件夹 。
MoveFolder :移动一个文件夹 。
CopyFolder:复制一个文件夹 。
FolderExists: 查找一个文件夹是否在驱动器上 。
GetFolder :获得已有Folder对象的一个实例 。
GetParentFolderName: 找出一个文件夹的父文件夹的名称。
GetSpecialFolder: 找出系统文件夹的路径。
Folder对象的方法:
Delete :创建一个文件夹 。
Move :移动一个文件夹 。
Copy:复制一个文件夹。
Name:检索文件夹的名称。
     在此需要强调一点,前面我们曾经提到过FSO对象模型包含的方法是冗余的,所以Folder对象的Delete、Move、Copy方法和FileSystemObject对象的DeleteFolder、MoveFolder、CopyFolder方法实际上是相同的,因此在实际使用中可以任选其中的一种。和Drive对象一样,下面通过实例演示Folder对象的应用。在VB下新建一个工程,然后在上面添加三个命令按钮,然后在Form1的通用部分加入以下代码:
Option Explicit
Dim fsoTest As New FileSystemObject
Dim folder1 As Folder
并且分别在三个命令按钮的click事件输入以下代码:
Private Sub CmdCreate_Click()
' 获取 Folder 对象。
Set folder1 = fsoTest.GetFolder(“C:")
'创建文件夹
fsoTest.CreateFolder (“C:\Test")
MsgBox “folder C:\Test has created"
End Sub
Private Sub CmdDelete_Click()
' 获取 Drive 对象。
Set folder1 = fsoTest.GetFolder(“C:")
'删除文件夹
fsoTest.DeleteFolder (“C:\Test")
MsgBox“folder C:\Test has deleted"
End Sub
Private Sub CmdGetPro_Click()
'获取文件夹的有关信息
Dim sReturn As String
Set folder1 = fsoTest.GetFolder(“C:\Windows")
'sReturn = “The folder's Attributes is " & folder1.Attributes & vbCrLf
'获取最近一次访问的时间
sReturn = sReturn & “The folder's last access time is " & folder1.DateLastAccessed & vbCrLf
'获取最后一次修改的时间
sReturn = sReturn & “The folder's last modify time is " & folder1.DateLastModified & vbCrLf
'获取文件夹的大小
sReturn = sReturn & “The folder's size is " & FormatNumber(folder1.Size / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
'判断文件或文件夹类型
sReturn = sReturn & “The type is " & folder1.Type & vbCrLf
MsgBox sReturn
End Sub
    上述代码中提到的CreateFolder方法的语法形式为object.CreateFolder(foldername)。foldername指定了要创建的文件夹的名称,而DeleteFolder方法的语法形式为object.DeleteFolder folderspec[,force],其中,folderspec用来指定要删除的文件夹的名称,force是一个可选的布尔型参数,如果希望删除只读属性的文件夹则将该值设为TRUE,默认为FALSE。至于代码中用到的 Folder 对象的属性限于篇幅,就不详细介绍了,读者可参考VB文档中的相关内容。

    (四)File对象和TextStream对象
    由于有关File对象的复制,删除,移动等操作和Folder对象类似,所以这部分内容就不再重复。这里主要讲述利用File对象和TextStream对象操作文本文件。
    通常对文本文件的操作包括在文本文件中创建数据,在文本文件中添加数据,删除文本文件的数据等操作。这些操作都可以通过File对象和FileSystemObject对象的相关方法完成。不过在使用之前,首先要创建一个文本文件,这可以通过三种方法完成。一种方法是使用FileSystemObject对象的 CreateTextFile 方法。要创建一个空文本文件,可以用以下语句:
Dim fsoTest As New FileSystemObject, fil1 As File
Set fil 1= fsoTest.CreateTextFile(“c:\testfile.txt", True)
第二种方法是使用 FileSystemObject 对象带 ForWriting 标志设置的 OpenTextFile 方法,
Dim fsoTest As New FileSystemObject, ts1 As New TextStream
Set ts1 = fsoTest.OpenTextFile(“c:\testfile.txt", ForWriting)
第三种方法是使用File对象的带 ForWriting 标志设置的 OpenAsTextStream 方法:
Dim fsoTest As New FileSystemObject, fil 1As File, ts 1As TextStream
Set fsoTest = CreateObject(“Scripting.FileSystemObject")
fsoTest.CreateTextFile (“c:\testfile.txt")
Set fil1 = fsoTest.GetFile(“c:\testfile.txt")
Set ts1 = fil1.OpenAsTextStream(ForWriting)
    其中CreateTextFile方法的第一个参数用来指定,第二个参数用来指定如果磁盘上已经存在要创建的文件是否覆盖,TRUE表示覆盖,FALSE表示不覆盖,省略表示不覆盖;OpenTextFile方法的第一个参数确定要打开的文本文件,第二个参数表示对该文件进行写操作;OpenAsTextStream方法的参数和OpenTextFile方法的第二个参数含义相同。
    在创建了写入数据的文本之后就可以利用TextStream 对象的 Write 或 WriteLine 方法了,它们之间的区别在于 WriteLine 在指定的字符串末尾添加换行符,而Write方法没有。如果想要向文本文件中添加一个空行,可以使用 WriteBlankLines 方法。 在完成写的动作之后,用Close方法关闭打开的文本文件。如果要读取一个存在的文本文件的内容,就要用到 TextStream 对象的 Read、 ReadLine 或 ReadAll 方法;这些方法的区别是 Read:从一个文件中读取指定数量的字符 ;ReadLine:读取一整行(紧跟,但不包括,换行符); ReadAll :读取一个文本文件的所有内容。下面在一个VB的工程中演示上述的效果。
    在VB中新建一个工程,然后在Form1上添加两个命令按钮,然后输入以下代码:
Private Sub CmdRead_Click()
Dim fsoTest As New FileSystemObject, file1 As File, ts As TextStream, s As String
Set file1 = fsoTest.GetFile(“C:\testfile.txt")
Set ts = file1.OpenAsTextStream(ForReading)
'读取一行
s = ts.ReadLine
MsgBox s
ts.Close
End Sub
Private Sub CmdWrite_Click()
Dim txtfile As File, ts As TextStream
Set txtfile = fsoTest.GetFile(“c:\testfile.txt")
Set ts = txtfile.OpenAsTextStream(ForWriting)
'使用Write方法写入一行。
ts.Write (“This is only a Test")
' 写入一行带有换行符的文本。
ts.WriteLine (“Testing 1, 2, 3.")
' 向文件中写入三个换行符。
ts.WriteBlankLines (3)
ts.Close
End Sub
在这里我们假设已经在磁盘上建立了一个名为testfile.txt的文件。在按下F5运行时,先单击Write写入数据,然后按下Read读取数据。

    三、结束语
    通过上面的介绍,我们可以看到FSO对象模型的确在传统的文件操作语句之外,提供了一种更方便,功能更强大的访问文件的操作方法。不过,我们还需要注意到FSO对象模型目前还不完善,当前使用的FSO对象模型还不支持创建随机文件或二进制文件。要创建随机文件和二进制文件,仍然要使用带 Random 或 Binary 标志的 Open 命令。但从目前FSO对象模型的实际应用来看,我们仍然可以将FSO对象模型作为一种比较简便的文件操作解决方案。
    (注:上述代码均在VB6.0 SR3)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-11 13:56:09 | 显示全部楼层
这种思想不错,在VLISP可以仿照的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-6-9 19:10 , Processed in 0.453655 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表