现在网上下载的软件大部分都需要注册后才能使用其全部的功能也就是说当前大部分软件都是建立了注册机制的对于一个刚进入软件行业的程序员来说一定非常想了解其中的注册机制是怎样实现的其实用VC开发软件是可以很方便地加入注册机制的 要实现软件注册功能首先需要知道实现注册机制要涉及到的几个问题如何加入注册检测判断软件是否注册如何生成注册码如何保证一个用户名只生成与之唯一对应的注册码在软件不注册情况下如何限制软件功能的局限性对已经负费使用用户而言不应造成使用不便 首先应该有一个生成注册码的算法以下是我简单的一个生成为注册码的算法 //该函数返回一个CSTRING类型的位注册码入口参数为用户名 CString GetRegPasswd(CString &DirName) { //将用户名换算成位注册码 long NumNumNum; char sn[]={}; CString p; int ilen; Num=; Num=; Num=; len=int(strlen(DirName)); if(len!=) { for( i=;i<=len;i++) { //第一步算法 Num=(long(Num+(int(DirName[i])*i*i)*(i*sqrt(DirName[i])+)))%; //第二步算法 Num=(Num*i+(long(pow((int)DirName[i])*i)))%; //第三步算法 Num=(Num+(long)sqrt(Num))%; } //以下把三个算法结果分别生成个字符共有个 for(i=;i<;i++) sn[i]=(int)(Num++i*i*i)%; for(i=;i<;i++) sn[i]=(int)(Num++i*i*i)%; for(i=;i<;i++) sn[i]=(int)(Num++i*i*i)%; sn[]=; //以下循环把所有生成的字符转换为AZaz for(i=;i<;i++) { while((sn[i]<@#@# || sn[i]>@#@#) && (sn[i]<@#A@# || sn[i]>@#Z@#) &&(sn[i]<@#a@# || sn[i]>@#z@#) ) { sn[i]=(sn[i]++*i)%; } } //赋值给一个CSTRING变量用做函数返回值 pFormat(%ssn); } return p; } //检查软件是否注册的函数 BOOL GetRegFlag(void) { HKEY hKey = NULL; BYTE i; CString str; strLoadString(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 SzMimaNULLNULL &i&cbA) != ERROR_SUCCESS) return false; BYTE j=i; if(j==)//代表软件已经注册可以正常使用 { RegCloseKey(hKey); return true; } else { RegCloseKey(hKey); return false; } return false; }; //设置软件已经注册标志的函数 BOOL SetRegFlag(void) { HKEY hKey = NULL; BYTE i; CString str; strLoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 if (RegCreateKey(HKEY_CURRENT_USER str &hKey) != ERROR_SUCCESS) return false; BYTE j=;//代表已经注册 if(RegSetValueEx(hKey SzMima REG_BINARY &j) != ERROR_SUCCESS) { AfxMessageBox(设置注册表数据失败!); return FALSE; } return false; }; 以上三个函数即可实现软件注册机制只需要在程序初始化的时候加入以下几句代码即可 BOOL bReg= GetRegFlag (); if(!bReg) { //在此加入限制功能或者拒绝是使用的代码 } 如果用户注册只需要加入以下代码即可 //这是我的程序中的一个注册界面输入用户名和注册码提交后检验注册码是否正确的代码 void CRegEdit::OnBnClickedOk() { if(!UpdateData()) return;//取得编辑框的内容并赋值到类变量中 m_RegUserTrimLeft();//m_RegUser是用户名 m_RegUserTrimRight(); if(m_RegUserIsEmpty()) { AfxMessageBox(用户名不能为空请重新输入); GetDlgItem(IDC_REGUSER)>SetFocus(); return; } m_RegPasswdTrimLeft();m_RegPasswd是注册码 m_RegPasswdTrimRight(); if(m_RegPasswdIsEmpty()) { AfxMessageBox(注册码不能为空请重新输入); GetDlgItem(IDC_REGPASSWD)>SetFocus(); return; } CString Passwd; Passwd=GetRegPasswd(m_RegUser);//调用算法取得该用户名的注册码 if(Passwd==m_RegPasswd)//与用户输入的注册进行比较 { SetRegFlag();//设置注册标志 OnOK(); } else AfxMessageBox(注册码错误请重新输入); UpdateData(false); } 以上就是在VC中实现注册机制的主要的代码把他们加入您的程序即可程序代码已在VC/WIN/WIN 环境中运行通过并在实际运用中得到验证对已经注册的用户将不会有任何的障碍只需录入注册码一次就可以不增加其日常使用的负担而对非法用户的使用而言取决于软件的作者赋予他们的权利 |