精品主页 | 软件下载 | 系统下载 | 精品导航| 精彩图片 | 转帖工具 | 版主申请 | 影视下载
发新话题
打印

如何用VC实现软件注册

如何用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)))0000;



  //第二步算法



  Num2=(Num2*i (long(pow((int)DirName[i-1],2)*i)))0000;



  //第三步算法



  Num3=(Num2 (long)sqrt(Num1))0000;



  }


  


                  


<BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px">






  //以下把三个算法结果分别生成5个字符,共有15个



  for(i=0;i&lt;5;i  )



  sn=(int)(Num1 31 i*i*i)8;



  for(i=5;i&lt;10;i  )



  sn=(int)(Num2 31 i*i*i)8;



  for(i=10;i&lt;15;i  )



  sn=(int)(Num3 31 i*i*i)8;



  sn[15]=0;



  //以下循环把所有生成的字符转换为0---9,A---Z,a----z



  for(i=0;i&lt;15;i  )



  {



  while((sn&lt;'0'    sn&gt;'9') && (sn&lt;'A'    sn&gt;'Z') &&(sn&lt;'a'    sn&gt;'z') )



  {



  sn=(sn 31 7*i)8;



  }



  }



  //赋值给一个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)-&gt;SetFocus();



  return;



  }



  m_RegPasswd.TrimLeft();m_RegPasswd是注册码



  m_RegPasswd.TrimRight();



  if(m_RegPasswd.IsEmpty())



  {



  AfxMessageBox("注册码不能为空,请重新输入。");



  GetDlgItem(IDC_REGPASSWD)-&gt;SetFocus();



  return;



  }



  CString Passwd;



  Passwd=GetRegPasswd(m_RegUser);//调用算法取得该用户名的注册码



  if(Passwd==m_RegPasswd)//与用户输入的注册进行比较



  {



  SetRegFlag();//设置注册标志



  OnOK();



  }



  else



  AfxMessageBox("注册码错误,请重新输入。");



  UpdateData(false);



  }

</BLOCKQUOTE>

TOP

发新话题