Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2011, 22:56   #1
Алька2206
 
Регистрация: 08.10.2010
Сообщений: 7
По умолчанию контроль запусков приложения

задача в том, чтобы ограничить количество запусков приложения. например, чтобы программа запускалась 10 раз, а 11 раз - не запускалась.
у меня есть готовое решение данной программы, но смысла того, что здесь делается, понять не могу.
используются два проекта: консольный FileWriter.dpr и проект ExecCounter.dpr, содержащий модуль CounterModule.
(программа получает из командной строки три параметра: (1) имя файла; (2) имя строки, которую следует найти в файле; (3) значение, на которое надо заменить в файле (1) следующий за строкой (2) символ.)
если кто-то поможет разобраться во всем, буду признательна.

Код:
{$APPTYPE CONSOLE}
uses
  SysUtils;
const
  temp_path: string = 'QWtempQW.txt'; // для чего эта переменная и что означает 'QWtempQW.txt'?
  timeout: TDateTime = 10e-6; // содержит значение даты и времени, но что значит 10e-6 ?
var
  f_in: file of byte;
  f_out: file of byte;
  b: byte;
  temp: string; //общее значение переменных вроде поняла
  to_write: byte; //значение, на которое надо заменить в файле (1) следующий за строкой (2) символ
  counter_str: string; //имя строки, которую следует найти в файле
  path: string; //имя файла
  timeStarted: TDateTime;
 
begin
  timeStarted:= GetTime; // возвращает текущее время
  while (GetTime < (timeStarted + timeout)) do; //пока текущее время меньше..чего?
 
  if (ParamCount < 3) then halt(1); //если число параметров командной строки < 3, тогда завершить..что?
  path:= ParamStr(1);
  counter_str:= ParamStr(2); 
  to_write:= StrToInt( ParamStr(3) ); 
  Assign(f_out, temp_path);
  Rewrite(f_out);
 
  Assign(f_in, path);
  FileMode:= fmOpenRead; //устанавливается режим только для чтения
  Reset(f_in);
  while not eof(f_in) do //цикл не понятен вообще...
  begin
    read(f_in, b);
    temp:= temp+chr(b);
    if (temp = counter_str) then
      begin
        write(f_out, b);
        read(f_in, b);
        b:= to_write;
      end;
    if ( length(temp) = length(counter_str) ) then
      temp := copy(temp, 2, length(temp)-1);
    write(f_out, b);
  end;
  Close(f_in);
  Close(f_out);
  SysUtils.DeleteFile(path);
  SysUtils.RenameFile(temp_path, path);
end.
Проекту ExecCounter соответствует файл проекта:
Код:
{$APPTYPE CONSOLE}
uses 
  Windows,
  SysUtils,
  CounterModule in 'CounterModule.pas';
begin
  PreExit;
end.
Код:
unit CounterModule;
interface
  function GetExecutionsLeft: integer;
  procedure SetExecutionsLeft(number: integer);
  procedure PreExit;
 
implementation
uses Registry, Windows, SysUtils;
 
const
  key: string  = 'MyCounterModule\Subfolder'; //путь, где располагается мой модуль?
  writer_path: string  = 'FileWriter.exe'; //следующие три константы не понятны, впрочем как и функции..
  counterField = 'runs_counter'#20;
  registryEntry: string = 'runs left';
var
  reg: TRegistry;
  counterValue: integer;
 
function GetExecutionsLeft: integer;
begin
  reg.OpenKey(key, false);
  counterValue := reg.ReadInteger(registryEntry);
  reg.CloseKey;
 
  result := counterValue;
end;
 
procedure SetExecutionsLeft(number: integer);
begin
  counterValue := number;
 
  reg.OpenKey(key, true);
  reg.WriteInteger(registryEntry, counterValue);
  reg.CloseKey;
end;
 
procedure PreExit;
var
  info: _StartUpInfoA;
  process_info: _PROCESS_INFORMATION;
  commandLine : string;
  len: integer;
begin
  len:= length(counterField);
  commandLine := writer_path+' '+ParamStr(0)+' '+copy(counterField, 1, len-1)
  +' '+IntToStr(counterValue);
 
  ZeroMemory(@info, sizeof(info));
  CreateProcess(PAnsiChar(writer_path),
    PAnsiChar(commandLine),
    nil, nil, false,
    CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
    nil, nil, info, process_info);
end;
 
begin
  reg := TRegistry.Create;
  if ( not reg.KeyExists(key) ) then
      SetExecutionsLeft(ord( counterField[length(counterField)] ));
  GetExecutionsLeft;
  if (counterValue = 0) then       //если счетчик запусков равен 0, то
    Halt;                          //завершить программу
  showMessage ('Осталось '+intToStr (countValue)+' запусков');
  dec(counterValue);                //уменьшить на 1 счетчик запусков
  SetExecutionsLeft(counterValue);
end.
Алька2206 вне форума Ответить с цитированием
Старый 18.03.2011, 00:55   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Да, весьма суровый код.

В общем, основная логика: счетчик запусков хранится в двух местах - в exe-файле и в реестре (название ключа в константе key, параметра - в registryentry).
При запуске основной программы (в секции инициализации модуля) проверяется, создан ли уже в реестре ключ; если создан - счетчик запусков читается оттуда, если нет - ключ создается, и счетчик берется из exe-файла.
Перед завершением основной программы вызывается функция PreExit, которая запускает программу, записывающую счетчик в главный exe-файл (FileWriter). В момент запуска этого врайтера основная программа еще работает, и в ее файл писать нельзя; поэтому он ждет чуть меньше секунды (timeout), чтобы главная программа успела завершиться, потом создает измененную копию exe во временном файле (temp_path), записывает в нее счетчик, и заменяет ею основной exe-файл.

Примерно так, если что-то непонятно - стукни завтра ближе к вечеру в icq 388676648, объясню подробнее )
Son Of Pain вне форума Ответить с цитированием
Старый 27.03.2011, 00:10   #3
Алька2206
 
Регистрация: 08.10.2010
Сообщений: 7
По умолчанию

спасибо большое, но все равно не могу разобраться со многим.. в аську постучала. )
Алька2206 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать количество запусков qwerty3434 Общие вопросы C/C++ 8 05.06.2010 13:22
Ограничение количества запусков файла. sergiksergik Microsoft Office Excel 3 04.02.2010 12:44
Счётчик запусков Яр|/||< (^_^) Софт 4 15.08.2009 15:30
Ограничение запусков программы - Паскаль Legolender Помощь студентам 3 26.11.2008 20:50
Ограничение запусков программы?? John_chek Общие вопросы Delphi 14 24.11.2008 14:26