zoukankan      html  css  js  c++  java
  • 程序中怎样限制使用时间

    1、利用注册表啊
    第一次运行程序时,在注册表里创建初始信息。以后每次运行程序时,在程序中从注册表里读,并判断使用时间,超过时间就Application.Terminate就行了

    2、unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Registry, Dialogs;

    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);
    var
        registerTemp : TRegistry;
        curDate : TDateTime;
    begin
        registerTemp := TRegistry.Create;
        with registerTemp do
        begin
            RootKey := HKEY_LOCAL_MACHINE;
            //判断是否初次运行程序
            if OpenKey('SoftwareMySoftware',True) then
            begin
                if ReadBool('Runned') then
                //不是第一次运行
                begin
                    curDate := Date;
                    if (curDate-ReadTime('LastRunTime'))>=ReadInteger('Duration') then
                    begin
                        //当前的系统时间超出了使用期限
                        ShowMessage('试用版已到期');
                        exit;
                    end
                    else
                    begin
                        DeleteKey('LastRunTime');
                        WriteTime('LastRunTime',Date);
                    end;
                end
                else
                begin
                    //初次运行程序
                    DeleteKey('Runned');
                    WriteBool('Runned',True);
                    //设置试用期限30天
                    WriteInteger('Duration',30);
                    //写入当前运行时间
                    WriteTime('LastRunTime',Date);
                end;
            end
            else
            begin
                ShowMessage('Fails!');
            end;
            CloseKey;
        end;
    end;

    end.

    3、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;

  • 相关阅读:
    汇编笔记
    PHP笔记——SOAP
    Eclipse 插件资源地址记录
    使用SetWindowLong修改窗口样式
    C++ builder 剪贴板Clipboard使用
    c++ builder 实现右键选择节点实现方式
    c++ builder 使listview获得焦点并选择第一个节点
    c++ builder 2009 启用codeguard 检测内存泄漏
    c++ builder 2009如何生成独立运行exe
    WPF编程学习——样式
  • 原文地址:https://www.cnblogs.com/hssbsw/p/3802581.html
Copyright © 2011-2022 走看看