项目开发中有时会需要对软件加锁或者是使用日期。以下一种加锁的方式,通过注册表进行时间加锁,但是缺点在于只要换新机器或者重装系统情况下会造成加锁失败。
#include <QObject>
#define startname "B890E289-52B6-4798-9417-9DC9E22CA58A" //创建的第一次注册表名称
#define endname "EB528F9D-5BD0-49E1-B96E-9B14F51E9A66" //创建的最新注册表名称
class licence : public QObject
{
Q_OBJECT
public:
licence();
~licence();
public:
void detection_regrdit();
void set_regedit(QString keyName, QString regvalue);
void update_regedit();
bool licence_valid();
private:
QString regPath = "HKEY_CURRENT_USER";//创建的注册表路径
};
#include "licence.h"
#include <QSettings>
#include <QTime>
#include <QMessageBox>
licence::licence(){detection_regrdit();}
licence::~licence(){}
void licence::detection_regrdit()
{
QDateTime time = QDateTime::currentDateTime();
int myyime = time.toTime_t();
time.setTime_t(myyime);
bool start_key = false;
bool end_key = false;
QSettings* programReg = new QSettings(regPath, QSettings::NativeFormat);
QStringList keys = programReg->allKeys();//读取目录下所有键值
for (int i = 0; i < keys.size(); i++) {//检测注册表键是否存在,不存在就创建
QString id = keys.at(i);
if (id.contains(startname))
{
start_key = true;
}
else if(id.contains(endname))
{
end_key = true;
}
if ((end_key == start_key) && (end_key == true))
{
break;
}
}
if (start_key == false)
{
QDateTime time = QDateTime::currentDateTime();
int mytime = time.toTime_t();
set_regedit(startname, QString::number(mytime));//写注册表
QString currentTime = time.toString("yyyy-MM-dd hh:mm:ss ddd");
}
if (end_key == false)
{
QDateTime time = QDateTime::currentDateTime();
time = time.addDays(60); //授权时间90天
int mytime = time.toTime_t();
set_regedit(endname, QString::number(mytime));//写注册表
QString currentTime = time.toString("yyyy-MM-dd hh:mm:ss ddd");
}
delete programReg;
}
void licence::set_regedit(QString keyName, QString regvalue)
{
//QString regeditFileName = regPath + keyName;
QSettings* writeReg = new QSettings(regPath, QSettings::NativeFormat);
writeReg->setValue(keyName, regvalue);//写注册表
delete writeReg;
}
void licence::update_regedit()
{
QSettings* ReadReg = new QSettings(regPath, QSettings::NativeFormat);
QString value = ReadReg->value(startname).toString();//读注册表
delete ReadReg;
QDateTime time;
time.setTime_t(value.toInt());
QDateTime currenttime = QDateTime::currentDateTime();
int mytime = currenttime.toTime_t();
//修改开始时间 开始时间大约最初的开始时间才可以修改
if (currenttime > time)
{
set_regedit(startname, QString::number(mytime));//写注册表
}
}
bool licence::licence_valid()
{
QSettings* startReg = new QSettings(regPath, QSettings::NativeFormat);
QString start = startReg->value(startname).toString();//读注册表
delete startReg;
QSettings* endReg = new QSettings(regPath, QSettings::NativeFormat);
QString end = endReg->value(endname).toString();//读注册表
delete endReg;
QDateTime startTime, endTime;
startTime.setTime_t(start.toInt());
endTime.setTime_t(end.toInt());
if (endTime > startTime)
{
return true;
}
else
{
QMessageBox::information(NULL, u8"授权时间", u8"授权时间过期", QMessageBox::Ok);
return false;
}
}