如何根据用户名生成注册码
现在网上下载的软件大部分都需要注册后才能使用其全部的功能,也就是说当前大部分软件都是建立了注册机制的,对于一个刚进入软件行业的程序员来说一定非常想了解其中的注册机制是怎样实现的。其实用VC开发软件,是可以很方便地加入注册机制的。
要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题: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);
}
以上就是在VC中实现注册机制的主要的代码,把他们加入您的程序即可。程序代码已在VC6.0/WIN98/WIN 2000环境中运行通过,并在实际运用中得到验证。对已经注册的用户将不会有任何的障碍,只需录入注册码一次就可以,不增加其日常使用的负担;而对非法用户的使用而言,取决于软件的作者赋予他们的权利。
要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题: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);
}
以上就是在VC中实现注册机制的主要的代码,把他们加入您的程序即可。程序代码已在VC6.0/WIN98/WIN 2000环境中运行通过,并在实际运用中得到验证。对已经注册的用户将不会有任何的障碍,只需录入注册码一次就可以,不增加其日常使用的负担;而对非法用户的使用而言,取决于软件的作者赋予他们的权利。
佚名
2024-06-09 09:35:54
类似问题(10)
-
佚名2024-06-09 14:12:07
问如何根据名字查到美国注册公司的情况?
答您好,美国公司和我们的国内公司不一样,注册美国公司查名程序非常复杂,建议您还是委托专业的秘书服务公司查询,毕竟目前还没有一套完善的美国公司名字查册系统,也就说明...
-
佚名2024-06-09 04:35:42
问我今天注册了淘宝账户,用的是手机号码,注册好了以后,同时生成了以为我手机号码为账户名的支付宝
答一旦您已点击【同意协议并注册】,并提交注册成功,淘宝会员名(即淘宝账户名)将不能再被修改。 如果该会员名有存在写错或您不喜欢等情况,可以重新进行注册,但是不能再...
-
佚名2024-06-09 12:02:17
问机器码是@@@@905170 ,用户名和注册码是什么
答用户名:QQQQ注册码:@@@@@@@@67望采纳为满意回答
-
佚名2024-06-09 06:51:10
问机器码:@@@@@@5217 用户名和注册码是什么?
答用户名:aaa注册码:@@@@@@@@78
-
佚名2024-06-09 20:41:12
问我知道机器码 怎么能知道用户名和注册码?
答告诉软件商机器码后,交钱给软件商就可以知道用户名和注册码了,很简单的。
-
佚名2024-06-09 12:27:07
问屏幕录相专家V2014注册码机器码@@@@505141急求注册码和用户名
答用户名称:admin注册代码:@@@@@@@@57★激活代码仅供学习研究,请勿用于商业目的,如果喜欢,请购买正版!★★如果可行希望点击我答案右侧的“采纳”按钮(...
-
佚名2024-06-09 02:07:45
问软件已经注册如何查看注册码
答一般软件有注册信息……再软件属性或者帮助什么的里面可以找到
-
佚名2024-06-09 22:09:26
问如何根据电话号码查公司具体名称
答百度 114 换个电话打过去问一下,顺便了解一下公司。给你打电话的应该是人力资源部的,提前了解一下
-
佚名2024-06-09 08:00:00
问验电器是根据什么原理制成的?如何用
答验电器是根据什么原理制成的?——根据”同种电荷相斥“的原理制成的。
-
佚名2024-06-09 08:00:00
问屏幕录像专家机器码:@@@@@@1705 求用户名和注册码
答用户名:123注册码:@@@@@@@@50如果有帮助,请及时采纳
风水
起名
网名
- 1 qq网名个性四个字
- 2 古风霸气网名女生网名大全
- 3 在一起半年叫什么网名
- 4 一炮定江山之类的网名
- 5 女生特殊搞笑网名
- 6 花颜惹人醉情侣网名
- 7 爸爸微信网名 有咖啡
- 8 王者昵称撩汉
- 9 微信昵称旁有个小耳朵
- 10 世界杯球星昵称中
说说
- 1 qq友乐园个性签名
- 2 关于烟和的个性签名
- 3 朋友的生日说说
- 4 含蓄骂人的说说
- 5 是我太傻的说说
- 6 好累但是很快乐的说说
- 7 有表演天赋说说
- 8 山上跑的摩托车说说
- 9 妈妈对爸爸的说说
- 10 为了孩子一忍再忍的说说