如何使用vc++限制软件功能

2019独角兽企业重金招聘Python工程师标准>>>

hot3.png

开发软件的实践中,通常将软件分为几种版木:①release;②demo;③anti_copy:④register;⑤dog版本。release为正常的无限制发行版本,后几种受版权保护版本,其中demo版本为限制时间或者功能的版本;anti_copy是防复制版本,只有安装的版本才能使用,实现时安装程序将某个动态库放在指定的路径下,程序运行时验证该文件是否存在;register版本是用户通过向软件开发者提供软件注册申请码,由软件提供者生成注册码,返回给用户,即通过软件中提供的注册码验证机制实现软件系统功能的开放;dog版本通过硬件加密狗实现软件的版权保护。 1 限制软件部分功能

做法一是在软件的功能菜单中将该菜单所对应的功能实现函数全部置空,这样在执行该功能时会弹出提示对话框或者什么动也没有。做法二是为了方便起见,直接将菜单的属性设置为变灰或者非激活状态,这样在运行系统时,该菜单项就会变灰或者没有激活。这种方法虽然简便,但是如果用Visual C++直接以资源方式打开可执行文件的话,就可以将将变灰或者非辙活状态去掉,从而去掉软件部分功能的限制。

2 限制软件试用时间

这里介绍记录时间的时问限制方法。

2.1设置三个时间变量 起始时间:int nYear0,nMonth0,nDate0; 终止时间:int nYear,nMonth,nDate; 当前时间:int nYearCur,nMonthCur,nDateCur;

2.2初次运行时给上述变量的赋值 对于当前时间: SYSTEMTIME stCur; 2.GetSystemTnne(&stCur); 3.nYearCUFstCur.wYear.nMonthCur=stCur.wMonth; 4.nDateCur=stCur.wDay; 起始时间和终止时间的赋值是在程序第一次运行时将当前时间和预设的期限写入某个文件当中,以后将这两个时间同当前的系统时间进行比较,判断软件是否过期或者试用时间是否到期:

view sourceprint1.String sFn=”c:muxuanshe.sys”; 02.FII.E *fp=fopen(sFn,”rb”); 03.{ 04.
nDateO=nDateCur; 05.
nYear0=n YearCur; 06.
nMonthO=nMonthCur; 07.
nDate=nDate0; 08.
nYear=nYear0; 09.
nMonth=nMonth0+1; 10.
if(nMonth>12){ 11.
nMonth-=12; 12.
nYcar++; 13.
}//跨年度计算依次将起始时间、到期时间和当前时间及文件的字节数写入c:muxuanshe sys 14.} 2.3比较时间

每次运行时比较当前时间与文件记录中的时间,有两种情况,一是判断是否将系统系统时间提前:

if(IsPrcTime(nYear0,nMonth0,nDate0)||IsPreTime(nYear01d,nMo nthOld,nDateOJd)))其中nYearOld,nMonthOld,nDateOld为上次运行的时间:

view sourceprint1.BOOL JsOverTime(int nYear,int nMonth,int nDate) 02.{ 03.
SYSTEMTIME st; 04.
GetSysten/rime(&st); 05.
if(st.wYear>nYear) 06.
return TRUE; 07.
else if(st.wYearnMonth) 08.
return TRUE; 09.
else if(st.wMonth==nMonth&&st.wDay>nDate) 10.
return TRUE; 11.
return FALSF; 12.} 如果您前移了机器时间则将终止时间nYear=l并写入c:muxuanshe.sys,软件以后终止运行!

另一种情况是对于正常的剩余时问计算:IsOverTime(nYear,nMonth,nDate),不再赘述,具体实现请参见示例代码。

这里介绍的方法主要是要注意存放时间的文件要保密,如果知道了时间存放位置,那么时间限制就很容易被解除。也可以用其他更为稳妥的方法将时间存放,如存放在注册表中。

3根据机器码实现软件注册

机器码指与计算机硬件(CPU、网号、硬盘)有关的串号,如硬盘序列号、MAC地址等,编写软件的人常用机器码作为产生软件序列号的依据,目的是区分用户,确保自己的软件使用受控,下面通过读取用户计算机硬盘卷序列号,经一定的加密算法进行换算后,返回给用户一个产品注册码,由于硬盘卷序列号是唯一的,提供的产品注册码也是唯一的,用户利用该注册码通过验证后获得软件全部功能。

在笔者的编程实践中发现有时候由于所使用的函数不正确,常常不能正确获取硬盘的序列号,这里就这一问题进行讨论。

3.1不正确的序列号

利用GetVolumelnformation获取的计算机硬盘卷序列号,不是正确的唯一序列号:

view sourceprint1.void CWJGISApp::Register() 02.{ 03.
DWORD VolumeSerialNumber; 04.
GetVolumeInformation(“c:”

来源:NULL

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年2月10日
下一篇 2015年2月11日

相关推荐