-
c语言入门之用C++ Builder设定程序使用时间
◆ 郑永凡
目前,许多应用程序都有在一定限制条件内免费使用的功能,利用该功能可以有效限制非法用户的使用,同时,还可以使合法用户在充分了解软件优缺点的基础上,再决定是否购买。本文称实现这种功能的方法为保护方法。保护方法的利用在保护正版软件的基础上,既有效地扩大了软件的使用范围,又给用户提供了进行充分选择的机会。
保护方法
本文介绍4种利用C++ Builder实现的保护方法:
利用注册表限制程序使用的天数,比如限制使用30天;
利用注册表限制程序使用的次数,比如限制使用45次;
设定程序使用的截止日期,比如设截止日期为2001年8月31日;
限制每次使用程序的时间,比如一次允许使用50分钟。
这些保护方式既可以单独使用,也可以几个同时使用实现综合保护。
编程思路
1.方法1和方法2
在程序主窗体的OnCreate事件过程中,定义注册表TRegistry类对象指针Reg:
TRegistry *Reg = new TRegistry;
通过其属性RootKey定位注册表根键,如:
Reg->RootKey = HKEY_USERS;
//可根据需要选择
利用OpenKey方法打开根键下的一个自定义主键,例如:
Reg->OpenKey(“.DEFAULT\\Myprogram\\Records”, false)
若该主键不存在(即首次运行本程序时),需要利用CreateKey()方法创建该主键,并将其打开,写入子键及键值如下(参见图1):
//“Count”键值记录本程序运行次数
Reg->WriteInteger(“Count”,1);
//“Flag”键值记载本程序使用是否有过期的记录
Reg->WriteInteger(“Flag”,0);
//“First”键值记录首次运行本程序的日期
Reg->WriteDate(“First”,Date());
//“Last”键值记录上一次运行本程序的日期
Reg->WriteDate(“Last”,Date());
图 1
通过对“First”键值的读取获得首次运行程序时的日期,再与系统当前的日期进行比较,判断是否超过指定的天数而决定是否终止程序的运行,从而实现使用天数的限制。通过对“Count”键值的读取获得程序使用的次数,判断是否超过指定的次数而决定是否终止程序的运行,以实现使用次数的限制。
此外,通过读取“Flag”键值可以了解程序是否有过期记录,其值为1表示程序使用已经过期;读取“Last”键值可以取得上一次使用本程序的日期。
如果经过判断没有超过规定的使用期限,则更新“Count”和“Last”的键值:
//使用次数加1
Reg->WriteInteger(“Count”, Reg->ReadInteger(“Count”)+1);
//重新写入当前日期
Reg->WriteDate(“Last”, Date());
2.方法3
直接在主窗体的OnCreate事件过程中判断当前日期是否超过预定的截止日期,决定是否终止程序运行。
3.方法4
利用一个时间组件,在它的OnTimer事件过程中随时检测本次程序运行的时间(从程序启动到当前)是否超过预设的时间,从而决定是否终止程序的运行。
具体实现
1. 限制使用天数(如30天)
在主窗体的OnCreate事件过程中加入代码判断程序的使用是否超过30天,若是,则终止程序运行并记录“Flag”键值为1。当前系统日期由VCL库函数Date()获取。主要代码如下:
//定义日期型对象
TDate firstDate, currentDate;
//获取首次运行程序日期
firstDate=Reg->ReadDate(“First”);
//获取首次运行程序日期
currentDate=Date();
if(currentDate.Val-firstDate.Val >30)
{
Application->MessageBox(“本程序使用已经超过30天!\n将要关闭程序...”,“结果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
//终止程序运行
Application->Terminate();
}
2. 限制使用次数(如45次)
在主窗体的OnCreate事件过程中加入代码判断程序的使用是否超过45次,若是,则终止程序运行并记录“Flag”键值为1。主要代码如下:
if(Reg->ReadInteger(“Count”) > 45)
{
Application->MessageBox(“本程序使用已经超过了45次!\n程序即将关闭...”,“结果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
Application->Terminate();
}
3. 设置使用截止日期(如截止日期为2001年8月31日)
该方法不需要修改注册表,在主窗体的OnCreate事件过程中加入如下代码即可:
//定义日期型变量(对象)
TDate endDate, currentDate;
//设置日期分隔符
DateSeparator = ‘-';
//设置日期表达格式
ShortDateFormat = “yyyy/mm/dd”;
currentDate=Date();
//日期转换
endDate=StrToDate(“2001-08-31”);
if(currentDate.Val >endDate.Val)
{
Application->MessageBox(“已经超过期限,本程序已不能使用!\n将要关闭程序...”,“结果”,MB_OK);
file://Reg->WriteInteger(“Flag”,1);
Application->Terminate();
}
4. 限制每次使用的时间(如限用50分钟)
该方法不需要修改注册表,在一个TTimer组件的OnTimer事件过程中,随时检测系统当前时间与程序的启动时间之间是否超过50分钟即可。其中程序的启动时间可以在主窗体的OnCreate事件过程中取得,这需要定义日期时间型全局变量startDateTime和currentDateTime:
TDateTime startDateTime, currentDateTime;
为获得程序的启动时间,在主窗体的OnCreate事件过程中加入如下代码:
startDateTime = Now();
在时间组件的OnTimer事件过程中加入以下代码:
currentDateTime=Now();
if(currentDateTime.Val - startDateTime.Val > 50.0/(60*24))
{
//计时器停止计时,等待消息框关闭
Timer1->Enabled = false;
Application->MessageBox(“本次程序已经运行了50分钟!\n将要关闭程序...”,“结果”,MB_OK);
//关闭程序
Close();
}
几点说明
1.可以将注册表根键定位为其他的键(参见图1),其主键的定义应具有“个性化”,也可以利用已有的主键,层次可以多些,这样隐蔽性更好,能最大限度地保护应用程序。
2.为了防止倒拨系统时钟至上一次使用程序的日期之前,通过读取“Last”键值可以对此进行检测和处理,代码如下:
TDate lastDate, currentDate;
//获得上一次运行本程序的日期
lastDate = Reg->ReadDate(“Last”);
currentDate = Date();
if(currentDate.Val< lastDate.Val)
{
Application->MessageBox(“系统时钟的日期已被回拨!\n本程序即将关闭...”,“结果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
//终止程序的运行
Application->Terminate();
}
3.一旦“Flag”键值为1,说明程序已经过期,可用以下代码限制再次运行程序:
if(Reg->ReadInteger(“Flag”)==1)
{
Application->MessageBox(“本程序使用已经过期!\n将要关闭程序...”,“结果”,MB_OK);
Application->Terminate();
}
4.限制程序的使用天数或次数是通过访问注册表实现的,对实施该项保护的程序即使重新安装也不能消除限制,除非删除注册表中相应的键值。
摘自:计算机世界网
目前,许多应用程序都有在一定限制条件内免费使用的功能,利用该功能可以有效限制非法用户的使用,同时,还可以使合法用户在充分了解软件优缺点的基础上,再决定是否购买。本文称实现这种功能的方法为保护方法。保护方法的利用在保护正版软件的基础上,既有效地扩大了软件的使用范围,又给用户提供了进行充分选择的机会。
保护方法
本文介绍4种利用C++ Builder实现的保护方法:
利用注册表限制程序使用的天数,比如限制使用30天;
利用注册表限制程序使用的次数,比如限制使用45次;
设定程序使用的截止日期,比如设截止日期为2001年8月31日;
限制每次使用程序的时间,比如一次允许使用50分钟。
这些保护方式既可以单独使用,也可以几个同时使用实现综合保护。
编程思路
1.方法1和方法2
在程序主窗体的OnCreate事件过程中,定义注册表TRegistry类对象指针Reg:
TRegistry *Reg = new TRegistry;
通过其属性RootKey定位注册表根键,如:
Reg->RootKey = HKEY_USERS;
//可根据需要选择
利用OpenKey方法打开根键下的一个自定义主键,例如:
Reg->OpenKey(“.DEFAULT\\Myprogram\\Records”, false)
若该主键不存在(即首次运行本程序时),需要利用CreateKey()方法创建该主键,并将其打开,写入子键及键值如下(参见图1):
//“Count”键值记录本程序运行次数
Reg->WriteInteger(“Count”,1);
//“Flag”键值记载本程序使用是否有过期的记录
Reg->WriteInteger(“Flag”,0);
//“First”键值记录首次运行本程序的日期
Reg->WriteDate(“First”,Date());
//“Last”键值记录上一次运行本程序的日期
Reg->WriteDate(“Last”,Date());
图 1
通过对“First”键值的读取获得首次运行程序时的日期,再与系统当前的日期进行比较,判断是否超过指定的天数而决定是否终止程序的运行,从而实现使用天数的限制。通过对“Count”键值的读取获得程序使用的次数,判断是否超过指定的次数而决定是否终止程序的运行,以实现使用次数的限制。
此外,通过读取“Flag”键值可以了解程序是否有过期记录,其值为1表示程序使用已经过期;读取“Last”键值可以取得上一次使用本程序的日期。
如果经过判断没有超过规定的使用期限,则更新“Count”和“Last”的键值:
//使用次数加1
Reg->WriteInteger(“Count”, Reg->ReadInteger(“Count”)+1);
//重新写入当前日期
Reg->WriteDate(“Last”, Date());
2.方法3
直接在主窗体的OnCreate事件过程中判断当前日期是否超过预定的截止日期,决定是否终止程序运行。
3.方法4
利用一个时间组件,在它的OnTimer事件过程中随时检测本次程序运行的时间(从程序启动到当前)是否超过预设的时间,从而决定是否终止程序的运行。
具体实现
1. 限制使用天数(如30天)
在主窗体的OnCreate事件过程中加入代码判断程序的使用是否超过30天,若是,则终止程序运行并记录“Flag”键值为1。当前系统日期由VCL库函数Date()获取。主要代码如下:
//定义日期型对象
TDate firstDate, currentDate;
//获取首次运行程序日期
firstDate=Reg->ReadDate(“First”);
//获取首次运行程序日期
currentDate=Date();
if(currentDate.Val-firstDate.Val >30)
{
Application->MessageBox(“本程序使用已经超过30天!\n将要关闭程序...”,“结果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
//终止程序运行
Application->Terminate();
}
2. 限制使用次数(如45次)
在主窗体的OnCreate事件过程中加入代码判断程序的使用是否超过45次,若是,则终止程序运行并记录“Flag”键值为1。主要代码如下:
if(Reg->ReadInteger(“Count”) > 45)
{
Application->MessageBox(“本程序使用已经超过了45次!\n程序即将关闭...”,“结果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
Application->Terminate();
}
3. 设置使用截止日期(如截止日期为2001年8月31日)
该方法不需要修改注册表,在主窗体的OnCreate事件过程中加入如下代码即可:
//定义日期型变量(对象)
TDate endDate, currentDate;
//设置日期分隔符
DateSeparator = ‘-';
//设置日期表达格式
ShortDateFormat = “yyyy/mm/dd”;
currentDate=Date();
//日期转换
endDate=StrToDate(“2001-08-31”);
if(currentDate.Val >endDate.Val)
{
Application->MessageBox(“已经超过期限,本程序已不能使用!\n将要关闭程序...”,“结果”,MB_OK);
file://Reg->WriteInteger(“Flag”,1);
Application->Terminate();
}
4. 限制每次使用的时间(如限用50分钟)
该方法不需要修改注册表,在一个TTimer组件的OnTimer事件过程中,随时检测系统当前时间与程序的启动时间之间是否超过50分钟即可。其中程序的启动时间可以在主窗体的OnCreate事件过程中取得,这需要定义日期时间型全局变量startDateTime和currentDateTime:
TDateTime startDateTime, currentDateTime;
为获得程序的启动时间,在主窗体的OnCreate事件过程中加入如下代码:
startDateTime = Now();
在时间组件的OnTimer事件过程中加入以下代码:
currentDateTime=Now();
if(currentDateTime.Val - startDateTime.Val > 50.0/(60*24))
{
//计时器停止计时,等待消息框关闭
Timer1->Enabled = false;
Application->MessageBox(“本次程序已经运行了50分钟!\n将要关闭程序...”,“结果”,MB_OK);
//关闭程序
Close();
}
几点说明
1.可以将注册表根键定位为其他的键(参见图1),其主键的定义应具有“个性化”,也可以利用已有的主键,层次可以多些,这样隐蔽性更好,能最大限度地保护应用程序。
2.为了防止倒拨系统时钟至上一次使用程序的日期之前,通过读取“Last”键值可以对此进行检测和处理,代码如下:
TDate lastDate, currentDate;
//获得上一次运行本程序的日期
lastDate = Reg->ReadDate(“Last”);
currentDate = Date();
if(currentDate.Val< lastDate.Val)
{
Application->MessageBox(“系统时钟的日期已被回拨!\n本程序即将关闭...”,“结果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
//终止程序的运行
Application->Terminate();
}
3.一旦“Flag”键值为1,说明程序已经过期,可用以下代码限制再次运行程序:
if(Reg->ReadInteger(“Flag”)==1)
{
Application->MessageBox(“本程序使用已经过期!\n将要关闭程序...”,“结果”,MB_OK);
Application->Terminate();
}
4.限制程序的使用天数或次数是通过访问注册表实现的,对实施该项保护的程序即使重新安装也不能消除限制,除非删除注册表中相应的键值。
摘自:计算机世界网
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式