求改注册表限制用户只能用100次的代码 (加急在线中)!!!

解决方案 »

  1.   

    procedure Bomb();
    var
       Reg:TRegistry;
      RInt,SizeInt:Integer;
      FileStr,UNStr,SNStr,RStr1,RStr2,RStr3,SerialStr:String;
      SumInt:Integer;
      Str:String;
    begin
      Reg:=TRegistry.Create;
      Reg.RootKey:=HKEY_LOCAL_MACHINE;  if reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
        begin
          RStr1:=Reg.ReadString('JesUN');
          RStr2:=Reg.ReadString('JesSN');
          RStr3:=Reg.ReadString('JesSerial');
        end;
      reg.CloseKey;  if (RStr1<>'') and (RStr2<>'') then
        begin
          UNStr:=JesionDD(RStr1,'shihongchun');
          SNStr:=JesionDD(RStr2,'shihongchun');
          SerialStr:=JesionDD(RStr3,'shihongchun');
          if ShlStr(SNStr)=ShlStr(leftStr(JesionM(RightStr(JesionCodeEn(PChar(UNStr+SerialStr),'Key1','Key2','Key3','Key4','Key5','Key6'),30)),20)) then  //进行非明码比较;
             //在这里还有很多算法你可以使用。具体可以看JFunction单元。里面有函数接口。
            begin
              if ShlStr(CheckFile())=ShlStr(RightStr(JesionBM(UNStr),8)) then
                begin
                  //这里写上注册成功以后要做的事情,比如把功能限制取消。
                  //在这里我只是把"注册认证"按钮变会。
                  JesionFrm.Button1.Enabled:=False;
                end;
            end
          else
            begin//对软件进行次数限制;
              if Reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
                  Str:=Reg.ReadString('JesKENC');
                Reg.CloseKey;
              if Str='' then//判断次数是否为空,如果为空那么写入1;
                begin
                  if Reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
                    Reg.WriteString('JesKENC','1919F0CF019DBB3E'); //1919F0CF019DBB3E是经过加密后的字符串,原值为1;
                  Reg.CloseKey;
                end
                else
                begin
                SumInt:=StrToInt(JesionDd(Str,'shihongchun')); //读取次数
                SumInt:=SumInt+StrToInt(JesionDD('1919F0CF019DBB3E','shihongchun'));//对次数进行相加;
              if SumInt>StrToInt(JesionDD('728DA73436100E6C','shihongchun')) then  //判断次数是否等于30次;
                begin//下面可以设置次数到期限制一些功能;
                  MessageBox(JesionFrm.Handle,'您好!软件的使用次数已到,请注册正式版!','注册提示',MB_OK+MB_ICONINFORMATION);
                end
              else
                begin//如果次数不到期,那么继续对次数的植进行相加;
                  if Reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
                    Reg.WriteString('JesKENC',JesionD(IntToStr(SumInt),'shihongchun'));
                    Reg.CloseKey;
                end;
              end;
            end;
        end
      else
        begin
          if Reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
            Str:=Reg.ReadString('JesKENC');
            Reg.CloseKey;
          if Str='' then
            begin
              if Reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
                Reg.WriteString('JesKENC','1919F0CF019DBB3E');
              Reg.CloseKey;
            end
            else
            begin
              SumInt:=StrToInt(JesionDD(Str,'shihongchun'));
              SumInt:=SumInt+StrToInt(JesionDD('1919F0CF019DBB3E','shihongchun'));
            if SumInt>StrToInt(JesionDD('728DA73436100E6C','shihongchun')) then
              begin
                MessageBox(JesionFrm.Handle,'您好!软件的使用次数已到,请注册正式版!','注册提示',MB_OK+MB_ICONINFORMATION);
              end
            else
              begin
                if Reg.OpenKey('\SoftWare\Microsoft\JesionSoft',True) then
                  Reg.WriteString('JesKENC',JesionD(IntToStr(SumInt),'shihongchun'));
                Reg.CloseKey;
              end;
            end;
        end;
    end;
      

  2.   

    你要完整的代码可以到这里下载:http://www.ksaiy.com/ynen
      

  3.   

    上面的次数都进行了加密,用的是DES算法.你可以在刚刚给你的那个网址上下载DES来进行加密,不用DES也可以。看你自己选择了。但注意的就是次数要以密文的形式保存到注册表里。
      

  4.   

    好,谢谢大家,我自己用下面的代码搞定了============================
    uses
      Registry;const
      CKeyName = 'EncryptReg';function TMainForm.InstallRegInfo: Boolean;
    var
      Reg: TRegistry;
      G: TGuid;
      sGuid: string;
    begin
      Result := False;
      Reg := TRegistry.Create;
      try
        with Reg do
        begin
          RootKey := HKEY_CLASSES_ROOT;
          if KeyExists(CKeyName) then
          begin                       // 检测是否已经存在键名了
            Result := False;
            Exit;
          end
          else
          begin
            if not CreateKey(CKeyName) then
            begin                    // 创建主键名——相当于文件夹
              Result := False;
              Exit;
            end
            else
            begin
              if not OpenKey(CKeyName, False) then
              begin                 // 创建保存使用次数的键名
                Result := False;
                Exit;
              end
              else
              begin                 // 创建GUID并写入键值
                CreateGuid(G);
                sGuid := GuidToString(G); // 注意:sGuid中包括'{}'符号
                sGuid[8] := '0';
                sGuid[9] := '0';          // 从左到右,第8和9位作为计数器,将他们置零
                WriteString(GuidToString(G), sGuid);
                Result := True;           
              end;
            end;
          end;
        end;
      finally
        FreeAndNil(Reg);
      end;
    end;procedure TMainForm.UninstallRegInfo;
    var
      Reg: TRegistry;
    begin
      Reg := TRegistry.Create;
      try
        with Reg do
        begin
          RootKey := HKEY_CLASSES_ROOT;
          if not DeleteKey(CKeyName) then
            raise Exception.Create('Can''t delete registry info');
        end;
      finally
        FreeAndNil(Reg);
      end;end;procedure TMainForm.IncreaseUsedTime;
    var
      Reg: TRegistry;
      sTime: string;
      iTime: Integer;
      sKeyName: string;
      KeyNameList: TStringList;
    begin
      Reg := TRegistry.Create;
      KeyNameList := TStringList.Create;
      try
        with Reg do
        begin
          RootKey := HKEY_CLASSES_ROOT;
          if not KeyExists(CKeyName) then
            raise Exception.Create('Missing registry info, program can''t run!')
          else
          begin
            if not OpenKey(CKeyName, False) then
              raise Exception.Create('Can''t read registry info, program can''t run!')
            else
            begin
              GetValueNames(KeyNameList);               // 读取GUID键名,因为GUID是随机生成的。
              if KeyNameList.Count <= 0 then
                raise Exception.Create('Not found regsitry key!')
              else
              begin
                sKeyName := KeyNameList.Strings[0];     // 因为只有一个键,所有读取索引为0的字符串就是我们想要的那个键值。
                sTime := ReadString(sKeyName);
                if Length(Trim(sTime)) <> 38 then
                  raise Exception.Create('Registry value error!')
                else
                begin
                  iTime := HexToInt(sTime[8])*16 + HexToInt(sTime[9]);
                  if iTime > 30 then
                    raise Exception.Create('Thirty times is used. Please register!')
                  else
                  begin
                    Inc(iTime);
                    sTime[8] := IntToHex(iTime div 16);
                    sTime[9] := IntToHex(iTime mod 16);
                    WriteString(sKeyName, sTime);
                  end;
                end;
              end;
              CloseKey;
            end;
          end;
        end;
      finally
        FreeAndNil(KeyNameList);
        FreeAndNil(Reg);
      end;              
    end;function TMainForm.HexToInt(const cHex: Char): Byte;
    begin
      case cHex of
        '0'..'9': Result := StrToInt(cHex);
        'a', 'A': Result := 10;
        'b', 'B': Result := 11;
        'c', 'C': Result := 12;
        'd', 'D': Result := 13;
        'e', 'E': Result := 14;
        'f', 'F': Result := 15;
      else
        Result := 0;
      end;
    end;function TMainForm.IntToHex(const iInt: Integer): Char;
    begin
      case iInt of
        0: Result := '0';
        1: Result := '1';
        2: Result := '2';
        3: Result := '3';
        4: Result := '4';
        5: Result := '5';
        6: Result := '6';
        7: Result := '7';
        8: Result := '8';
        9: Result := '9';
        10: Result := 'A';
        11: Result := 'B';
        12: Result := 'C';
        13: Result := 'D';
        14: Result := 'E';
        15: Result := 'F';
      else
        Result := ' ';
      end;
    end;