如何用VC实现软件注册

类别:VC语言 点击:0 评论:0 推荐:
要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题:1、如何加入注册检测,判断软件是否注册;2、如何生成注册码,如何保证一个用户名只生成与之唯一对应的注册码;3、在软件不注册情况下,如何限制软件功能的局限性;4、对已经负费使用用户而言,不应造成使用不便。 首先,应该有一个生成注册码的算法,以下是我简单的一个生成15位注册码的算法: //该函数返回一个CSTRING类型的15位注册码,入口参数为用户名 CString GetRegPasswd(CString &DirName) { //将用户名换算成15位注册码 long Num1,Num2,Num3; char sn[16]={0}; CString p; int i,len; Num1=0; Num2=0; Num3=0; len=int(strlen(DirName)); if(len!=0) { for( i=1;i<=len;i++) { //第一步算法 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个 for(i=0;i<5;i++) sn[i]=(int)(Num1+31+i*i*i)%128; for(i=5;i<10;i++) sn[i]=(int)(Num2+31+i*i*i)%128; for(i=10;i<15;i++) sn[i]=(int)(Num3+31+i*i*i)%128; sn[15]=0; //以下循环把所有生成的字符转换为0---9,A---Z,a----z for(i=0;i<15;i++) { 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; } } //赋值给一个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); if( RegQueryValueEx(hKey, "SzMima",NULL,NULL, &i,&cbA) != ERROR_SUCCESS) return false; BYTE j=i; if(j==0)//0代表软件已经注册,可以正常使用 { 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代表已经注册 if(RegSetValueEx(hKey, "SzMima", 0, REG_BINARY, &j,4) != ERROR_SUCCESS) { AfxMessageBox("设置注册表数据失败!"); return FALSE; } return false; }; 以上三个函数即可实现软件注册机制,只需要在程序初始化的时候加入以下几句代码即可 BOOL bReg= GetRegFlag (); if(!bReg) { //在此加入限制功能或者拒绝是使用的代码 } 如果用户注册只需要加入以下代码即可 //这是我的程序中的一个注册界面,输入用户名和注册码提交后检验注册码是否正确的代码 void CRegEdit::OnBnClickedOk() { if(!UpdateData()) return;//取得编辑框的内容,并赋值到类变量中 m_RegUser.TrimLeft();//m_RegUser是用户名 m_RegUser.TrimRight(); if(m_RegUser.IsEmpty()) { AfxMessageBox("用户名不能为空,请重新输入。"); GetDlgItem(IDC_REGUSER)->SetFocus(); return; } m_RegPasswd.TrimLeft();m_RegPasswd是注册码 m_RegPasswd.TrimRight(); if(m_RegPasswd.IsEmpty()) { AfxMessageBox("注册码不能为空,请重新输入。"); GetDlgItem(IDC_REGPASSWD)->SetFocus(); return; } CString Passwd; Passwd=GetRegPasswd(m_RegUser);//调用算法取得该用户名的注册码 if(Passwd==m_RegPasswd)//与用户输入的注册进行比较 { SetRegFlag();//设置注册标志 OnOK(); } else AfxMessageBox("注册码错误,请重新输入。"); UpdateData(false); }

本文地址:http://com.8s8s.com/it/it1123.htm