要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题:1、如何加入注册检测,判断软件是否注册;2、如何生成注册码,如何保证一个用户名只生成与之唯一对应的注册码;3、在软件不注册情况下,如何限制软件功能的局限性;4、对已经负费使用用户而言,不应造成使用不便。 |
首先,应该有一个生成注册码的算法,以下是我简单的一个生成15位注册码的算法: |
//该函数返回一个CSTRING类型的15位注册码,入口参数为用户名 |
CString GetRegPasswd(CString &DirName) |
len=int(strlen(DirName)); |
Num1=(long(Num1+(int(DirName[i-1])*i*i)*(i*sqrt(DirName[i-1])+1)))%100000; |
Num2=(Num2*i+(long(pow((int)DirName[i-1],2)*i)))%100000; |
Num3=(Num2+(long)sqrt(Num1))%100000; |
//以下把三个算法结果分别生成5个字符,共有15个 |
sn[i]=(int)(Num1+31+i*i*i)%128; |
sn[i]=(int)(Num2+31+i*i*i)%128; |
sn[i]=(int)(Num3+31+i*i*i)%128; |
//以下循环把所有生成的字符转换为0---9,A---Z,a----z |
while((sn[i]<'0' || sn[i]>'9') && (sn[i]<'A' || sn[i]>'Z') &&(sn[i]<'a' || sn[i]>'z') ) |
sn[i]=(sn[i]+31+7*i)%128; |
str.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 |
if (RegCreateKey(HKEY_CURRENT_USER, str, &hKey) != ERROR_SUCCESS) return false; |
if( RegQueryValueEx(hKey, "SzMima",NULL,NULL, &i,&cbA) != ERROR_SUCCESS) |
if(j==0)//0代表软件已经注册,可以正常使用 |
str.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 |
if (RegCreateKey(HKEY_CURRENT_USER, str, &hKey) != ERROR_SUCCESS) return false; |
if(RegSetValueEx(hKey, "SzMima", 0, REG_BINARY, &j,4) != ERROR_SUCCESS) |
AfxMessageBox("设置注册表数据失败!"); |
以上三个函数即可实现软件注册机制,只需要在程序初始化的时候加入以下几句代码即可 |
BOOL bReg= GetRegFlag (); |
//这是我的程序中的一个注册界面,输入用户名和注册码提交后检验注册码是否正确的代码 |
void CRegEdit::OnBnClickedOk() |
if(!UpdateData()) return;//取得编辑框的内容,并赋值到类变量中 |
m_RegUser.TrimLeft();//m_RegUser是用户名 |
AfxMessageBox("用户名不能为空,请重新输入。"); |
GetDlgItem(IDC_REGUSER)->SetFocus(); |
m_RegPasswd.TrimLeft();m_RegPasswd是注册码 |
if(m_RegPasswd.IsEmpty()) |
AfxMessageBox("注册码不能为空,请重新输入。"); |
GetDlgItem(IDC_REGPASSWD)->SetFocus(); |
Passwd=GetRegPasswd(m_RegUser);//调用算法取得该用户名的注册码 |
if(Passwd==m_RegPasswd)//与用户输入的注册进行比较 |
AfxMessageBox("注册码错误,请重新输入。"); |
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理