如何用VC实现软件注册
来源:互联网 发布:精英特软件安卓版 编辑:程序博客网 时间:2024/04/27 18:27
要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题: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实现软件注册
- 如何用VC实现软件注册
- 如何用VC实现软件注册
- 如何用VC实现软件注册
- 如何用注册回调实现监听
- VC实现软件注册CODE
- VC++2008如何用tab控件实现属性页
- VC++2008如何用tab控件实现属性页
- Linux下如何用mdadm实现软件RAID
- 如何用VC界面下换肤
- VC中如何用OCX
- 浅析如何用C#.NET做屏幕截图软件以及注册全局快捷键(上)1
- 浅析如何用C#.NET做屏幕截图软件以及注册全局快捷键(下)
- 如何用installutil 注册windows服务
- 如何用JAVA生成注册序列号
- 如何用JAVA生成注册序列号
- 如何用代码注册广播接收者
- 如何用DataGrid实现分页?
- delphi连接数据库浅谈
- 一个简单Tracer类,用来为应用写入跟踪
- 天生程序员,我自豪
- GSM规范中的部分编码转换
- 用Delphi制作DLL小结
- 如何用VC实现软件注册
- A3A8算法的DLL
- 使用ACTIVEX和DELPHI开发串口通讯
- VB中的数据结构使用
- 高性能服务器软件开发
- ODBC & ACCESS
- 毫无废话: 从0开始一点一滴用java开发自己的B/S模式程序---1.1(绝对原创)
- 毫无废话: 从0开始一点一滴用java开发自己的B/S构架--1.2
- 毫无废话: 从0开始一点一滴用java开发自己B/S构架--2