基于Qt的机器绑定与有效期设置

这篇博客介绍了一种使用Qt库进行软件机器绑定的方法,通过计算硬件信息的哈希值生成激活码,并存储在注册表中。在运行时,程序会检查激活码的有效性,如果未激活或激活码错误,将提示用户输入正确的激活码进行激活。
摘要由CSDN通过智能技术生成

http://1.johnhome.sinaapp.com/?p=310


以下函数可分别 获取主机硬件信息:
CPU, cpuid
硬盘,hardDisk
主板,motherBoared
网卡信息,netInterfaceCard.
 
 
通过WMI接口获取硬件信息,但这些信息有些未必可靠

QString logInDialog : :getWMIHWInfo( int type){
/*
//0.当前原生网卡地址:
SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))
// 1.硬盘序列号
SELECT PNPDeviceID FROM Win32_DiskDrive WHERE(SerialNumber IS NOT NULL) AND (MediaType LIKE 'Fixed hard disk%')
//2.获取主板序列号
SELECT SerialNumber FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)
// 3.处理器ID
SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)
// 4.BIOS序列号
SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)
// 5.主板型号
SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)*/

QString hwInfo =tr( "");
QStringList sqlCmd;
sqlCmd.clear();
sqlCmd <<tr( "SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))");
//注意qt调用 wmi时,对查询语句要求很严格,所以 like之类的句子务必精确才能有结果出来
sqlCmd <<tr( "SELECT PNPDeviceID FROM Win32_DiskDrive WHERE( PNPDeviceID IS NOT NULL) AND (MediaType LIKE 'Fixed%')");
sqlCmd <<tr( "SELECT SerialNumber FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)");
sqlCmd <<tr( "SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)");
sqlCmd <<tr( "SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)");
sqlCmd <<tr( "SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)");
QStringList columnName;
columnName.clear();
columnName <<tr( "MACAddress");
columnName <<tr( "PNPDeviceID");
columnName <<tr( "SerialNumber");
columnName <<tr( "ProcessorId");
columnName <<tr( "SerialNumber");
columnName <<tr( "Product");
QAxObject  *objIWbemLocator  =  new QAxObject( "WbemScripting.SWbemLocator");
QAxObject  *objWMIService  =objIWbemLocator - >querySubObject( "ConnectServer(QString&,QString&)",QString( "."),QString( "root\\cimv2"));
QString query =tr( "");
if(type <sqlCmd.size())
query =sqlCmd.at(type);
QAxObject  *objInterList  = objWMIService - >querySubObject( "ExecQuery(QString&))", query);
QAxObject  *enum1  = objInterList - >querySubObject( "_NewEnum");
//需要 include windows.h
IEnumVARIANT * enumInterface  =  0;
enum1 - >queryInterface(IID_IEnumVARIANT, ( void * *) &enumInterface);
enumInterface - >Reset();
for ( int i  =  0; i  < objInterList - >dynamicCall( "Count").toInt(); i ++) {
VARIANT  *theItem  = (VARIANT *)malloc( sizeof(VARIANT));
if (enumInterface - >Next( 1,theItem,NULL)  != S_FALSE){
QAxObject  *item  =  new QAxObject((IUnknown  *)theItem - >punkVal);
if(item){
if(type <columnName.size()){
QByteArray datagram(columnName.at(type).toAscii());  //Or
const  char * tempConstChar  = datagram.data();
qDebug() << "the query is " <<query << " and cn is " <<QString : :fromAscii(tempConstChar);
hwInfo =item - >dynamicCall(tempConstChar).toString();
}
qDebug()  << " string is " <<hwInfo;
} else{
qDebug()  << " item is null";
}
} else{
qDebug()  << " item is false";
}
}
return hwInfo;
}

 
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值