【 tulaoshi.com - 编程语言 】
要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题:1、如何加入注册检测,判定软件是否注册;2、如何生成注册码,如何保证一个用户名只生成与之唯一对应的注册码;3、在软件不注册情况下,如何限制软件功能的局限性;4、对已经负费使用用户而言,不应造成使用不便。
!-- frame contents -- !-- /frame contents --
首先,应该有一个生成注册码的算法,以下是我简单的一个生成15位注册码的算法:
//该函数返回一个CSTRING类型的15位注册码,入口参数为用户名
CString GetRegPasswd(CString &DirName)
//将用户名换算成15位注册码
long Num1,Num2,Num3;
char sn16=0;
CString p;
int i,len;
Num1=0;
Num2=0;
Num3=0;
len=int(strlen(DirName));
for( i=1;i=len;i++)
//第一步算法
Num1=(long(Num1+(int(DirNamei-1)*i*i)*(i*sqrt(DirNamei-1)+1)))%100000;
//第二步算法
Num2=(Num2*i+(long(pow((int)DirNamei-1,2)*i)))%100000;
//第三步算法
Num3=(Num2+(long)sqrt(Num1))%100000;
//以下把三个算法结果分别生成5个字符,共有15个
for(i=0;i5;i++)
sni=(int)(Num1+31+i*i*i)%128;
for(i=5;i10;i++)
sni=(int)(Num2+31+i*i*i)%128;
for(i=10;i15;i++)
sni=(int)(Num3+31+i*i*i)%128;
sn15=0;
//以下循环把所有生成的字符转换为09,AZ,az
for(i=0;i15;i++)
while((sni0sni9) &&(sniZ)&&(sniz) )
sni=(sni+31+7*i)%128;
//赋值给一个CSTRING变量,用做函数返回值
p.Format(%s,sn);
return p;
//检查软件是否注册的函数:
BOOL GetRegFlag(void)
HKEY hKey = NULL;
BYTE i;
CString str;
str.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串
if (RegCreateKey(HKEY_CURRENT_USER, str, &hKey)!=ERROR_SUCCESS) return false;
DWord cbA;
cbA=sizeof(int);
return false;
BYTE j=i;
RegCloseKey(hKey);
return true;
else
RegCloseKey(hKey);
return false;
return false;
;
//设置软件已经注册标志的函数
BOOL SetRegFlag(void)
HKEY hKey = NULL;
BYTE i;
CString str;
str.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串
if (RegCreateKey(HKEY_CURRENT_USER, str, &hKey)!=ERROR_SUCCESS) return false;
BYTE j=0;//0代表已经注册
AfxMessageBox(设置注册表数据失败!);
return FALSE;
return false;
;
以上三个函数即可实现软件注册机制,只需要在程序初始化的时候加入以下几句代码即可
BOOL bReg= GetRegFlag ();
//在此加入限制功能或者拒绝是使用的代码
假如用户注册只需要加入以下代码即可
//这是我的程序中的一个注册界面,输入用户名和注册码提交后检验注册码是否正确的代码
void CRegEdit::OnBnClickedOk()
m_RegUser.Trimcenter();//m_RegUser是用户名
m_RegUser.Trimcenter();
AfxMessageBox(用户名不能为空,请重新输入。);
GetDlgItem(IDC_REGUSER)-SetFocus();
return;
m_RegPasswd.Trimcenter();m_RegPasswd是注册码
m_RegPasswd.Trimcenter();
AfxMessageBox(注册码不能为空,请重新输入。);
GetDlgItem(IDC_REGPASSWD)-SetFocus();
return;
CString Passwd;
Passwd=GetRegPasswd(m_RegUser);//调用算法取得该用户名的注册码
SetRegFlag();//设置注册标志
OnOK();
else
AfxMessageBox(注册码错误,请重新输入。);
UpdateData(false);
作者:程序员之家
更多内容请看常用软件加密宝典 软件插件 杀毒软件专栏专题,或