Защита программы паролем

Материал из DRKB


Защита программы паролем

Как видно из примера, программист может поместить любой код до обращения к методу Application.Run. В частности, он может показать диалоговое окно с запросом пароля и блокировать вызов Application.Run, если введенный пользователем пароль неверен. В следующем примере (листинг 4 - password.dpr) в проекте используются две формы: стандартная форма InputQuery и главная форма MainForm. Форма InputQuery создается при обращении к одноименной функции, определенной в модуле Dialogs. Она представляет собой небольшое диалоговое окно с однострочным редактором TEdit и двумя кнопками - ОК и Cancel. В окне пользователь должен ввести пароль (delphi) и нажать enter.

Листинг 4

program password;

uses
  Forms,
  Dialogs, // В этом модуле определена функция InputQuery
  Unit1 in 'unit1.pas' {MainForm};

{$r *.res}

var
  passwrd: string;
begin
  // Запрашиваем пароль:
  if InputQuery('Окно ввода пароля', 'Введите пароль:', passwrd) then
    // Проверяем его:
    if passwrd = 'delphi' then
    begin // Все в порядке, пароль верен
      Application.CreateForm(TMainForm, MainForm);
      Application.Run;
    end
    else
      ShowMessage('Пароль не верен!');
end.


Пробные версии программ

Вышеописанным способом можно создавать пробные версии программ, которые будут функционировать только до определенной даты или до исчерпания заданного количества запусков. В листинге 5 представлен файл проекта (trial.dpr), в котором пробная версия программы может запускаться не более 5 раз. Для запоминания номера очередного прогона используется системный реестр.

Листинг 5

program trial;

uses
  Forms,
  Unit1 in 'unit1.pas' {Form1},
  Registry, Dialogs; // Для TRegistry и ShowMessage

{$r *.res}

var
  reg: TRegistry;
  n: Integer;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    OpenKey('Software', True);
    OpenKey('TrialProg', True);
    if ValueExists('MaxRun') then // Первый запуск?
    begin // - Нет
      n := ReadInteger('MaxRun')-1;
      if n >= 0 then
        WriteInteger('MaxRun', n)
    end
    else
    begin // -Да, первый запуск
      n := 5;
      WriteInteger('MaxRun', n)
    end;
    Free;
  end;

  if n > 0 then
  begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end
  else
    ShowMessage('Исчерпано максимальное количество запусков'
      + ' пробной версии программы')
end.


Здесь следует дать небольшой комментарий. Модуль Registry декларирует класс TRegistry, который представляет программисту доступ к системному реестру Windows. С помощью двух обращений к функции TRegistry.OpenKey создается и/или открывается ключ HKEY_CURRENT_USER/Software/TrialProg системного реестра. Функция TRegistry.ValueExists возвращает True, если этот ключ содержит параметр с именем MaxRun и для него определено значение. При первом запуске приложения это не так, поэтому процедурой WriteInteger создается параметр и для него указывается начальное значение 5 (максимальное количество прогонов программы). При каждом следующем запуске этот параметр уменьшается на 1 и в момент, когда он становится равен 0, приложение блокирует создание и отображение главного окна.


Source: http://www.delphi.h5.ru/
ID: 04521