新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 用VC实现软件注册 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4687 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 用VC实现软件注册 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 用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);
    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/11/9 11:54:00
     
     wcdxyl 帅哥哟,离线,有人找我吗?天秤座1980-10-9
      
      
      威望:4
      等级:大四(每天看1小时莱昂氏)(版主)
      文章:158
      积分:1145
      门派:IEEE.ORG.CN
      注册:2006/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wcdxyl发送一个短消息 把wcdxyl加入好友 查看wcdxyl的个人资料 搜索wcdxyl在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wcdxyl的博客2
    发贴心情 
    这种方法实际不行,因为用户可以拿一个用户名和密码发出去,大家就都能用了。

    注册方式应该和机器网卡的地址绑定,也就是说应该用户先发送他机器的信息然后再放到算法里面去。他的机器网卡信息可以通过软件获取。

    ----------------------------------------------
    主页:http://wcdxyl.blogchina.com
    MSN:wcdxyl@163.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/11/16 10:30:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    想法不错,值得借鉴。售后这点工作量也不是太大。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/11/16 15:05:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 1:27:05

    本主题贴数3,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms