动态创建数据库限制软件使用次数
技术与开发
读者 小猪:我开发了一个食堂自动售饭系统,这个软件我想做成共享性质的,免费提供给用户使用几次后,如果用户想继续使用则必须付费,我收到费用后给出一段小程序提供给用户运行,这个用户就能终生免费使用,请问如何实现我的要求呢?
小编:达到你的目的并不难,我们可以用动态创建数据库,判断并操作数据库中字段的值即可实现你的要求。
我们在软件启动的时候秘密在用户的某一个目录下动态创建一个数据库(创建前先判断数据库是否存在),并在数据库中创建一张表和一个字段,字段的值用于监控用户使用软件的次数;每次用户启动的时候程序扫描字段的值,并判断字段的值是否超出了软件的使用次数,如果没有超出则把字段的值加1,并允许用户使用软件;如果超出了则关闭程序。
利用动态创建数据库的方法有几个优点:创建的数据库文件易于隐藏,用户轻易不能发现,即使发现也不能打开(我们在创建时设置密码);编程实现简单;可以绕开注册表的监控等等。

设计思路:程序OnCreate时动态创建一个数据库,并把数据库存放在一个不易被发现的目录,比如c:\ winnt\system32\drivers\etc\aaa.mdb下,创建时先判断aaa.mdb是否存在:
如果aaa.mdb不存在,则先动态创建这个数据库,为数据库设置密码,并创建一张表a,在表a中创建一个字段num,然后把字段num的值置为1;如果aaa.mdb存在,则不创建数据库和表,把数据库中的num字段读取出来,判断num的值。
如果num的值为0,表示软件进行了注册,允许进入软件主界面;如果num的值小于30且不等于0,表示在试用期,允许进入主界面,同时num的值加1;如果num的值大于等于30,表示软件试用期到了,程序终止。
当程序员收到用户的注册费用后,程序员理所当然应该让用户继续使用软件,因此单独制作一个小程序,此程序的作用是把num字段的值置0。设计流程图如下所示:
采用这种方法软件到期后,无论用户搜索注册表或者重新安装软件都不能继续使用,除非缴纳一定费用由开发人员给出的注册程序才能继续使用。
设计步骤
在这里笔者讲述用Delphi的具体实现,设置的数据库密码为123,数据库文件创建在D盘下,希望大家能掌握其中的技巧,灵活运用!
第一步:新建一个项目,在主窗体上添加一个ADOQuery1(ADO面板上),并在代码编辑器中的use中引用COMOBJ单元,有了这句话才能动态创建数据库
第二步:在窗体的OnCreate中加入如下代码:
procedure TForm1.FormCreate(Sender: TObject);
//建立Access文件,如果文件存在则不再创建数据库
var
CreateAccess:OleVariant;
tmp1:integer;
begin
if FileExists('d:\b.mdb')=false then//数据库不存在
begin
CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\b.mdb;Jet OLEDB:Database Password=123');//在D盘下创建数据库,并设置数据库密码
Query1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\b.mdb;Jet OLEDB:Database Password=123';
with Query1 do
begin
close;
sql.clear;
sql.add('CREATE TABLE bbb (num integer)');//创建表和字段
execsql;
end;
//创建表后把num的值赋值为1
with Query1 do
begin
Close;
SQL.Clear;
sql.add('select * from bbb');
open;
end;
Query1.Edit;
Query1.FieldByName('num').AsInteger:=1;
Query1.Post;
end
else//数据库存在
begin
Query1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\b.mdb;Jet OLEDB:Database Password=123';
Query1.Close;
Query1.SQL.Clear;
Query1.sql.add('select * from bbb');
Query1.open;
tmp1:=Query1.FieldByName('num').AsInteger;
if (tmp1<30) and (tmp1<>0) then//当num不等于0,且小于30则加1
begin
with Query1 do
begin
Close;
SQL.Clear;
sql.add('select * from bbb');
open;
end;
Query1.Edit;
Query1.FieldByName('num').AsInteger:=tmp1+1;
Query1.Post;
end;
if tmp1>=30 then
begin
MessageDlg('试用软件到期,请付费继续使用!', mtError,[mbOk], 0);
Application.Terminate;
end;
end;
end;
这样,我们就在软件中秘密创建了动态数据库,并能自动判断用户的使用次数了,当用户使用次数超过30次就必须付费来得到注册程序才能继续使用。
第三步:制作注册程序。打开delphi,新建一个项目,在窗体上添加一个Button1控件,并在Button1的OnClick事件中加入下面代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists('d:\b.mdb')=true then
begin
Query1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\b.mdb;Jet OLEDB:Database Password=123';
with Query1 do
begin
Close;
SQL.Clear;
sql.add('select * from bbb');
open;
end;
Query1.Edit;
Query1.FieldByName('num').AsInteger:=0;//找到数据库文件后,把num的值置0,使用户无限制使用
Query1.Post;
MessageDlg('注册成功,请继续使用本软件!', mtInformation,[mbOk], 0);
Application.Terminate;
end;
end;
总结
当然,我们开发的语言如果是VB或者其他的编程工具,实现原理都是采用动态创建数据库的方法来限制软件的使用次数,当然也可以限制软件的使用时间,比如30天,到了30天后就算修改系统时间也无济于事,大致算法如下:
首先,在数据库中建立三个字段first_time,last_time和days。其中first_time为系统第一次启动时的日期,即试用期的第一天。last_time为系统最近一次启动的时间,而days为30天(固定值)。
然后,系统每次启动会检测当前的日期同last_time做比较,如果当前的日期(如2000/09/30)在last_time(如2000/10/01)之前,说明系统时间被用户修改了,不予启动系统。反之,则转入下一步。
再次,取出数据库中的first_time同当前的日期做减法运算,然后和days的值做比较,看所用的天数是否在使用期限30天内,如果在,则转入下一步。
最后,修改数据库的last_time字段为当前的日期,显示系统已经使用的情况,正常启动系统。