BERDAFLEX Software Systems
Главная > Delphi > Принудительное завершение программы для администрирования

Принудительное завершение программы для администрирования

История переиздания
Издание 1.0 2003.11.30 Сергей Бердачук

Для упрощения администрирования, при работе с сетевой версией программы, чаще всего исполняемые модули выкладываются в общедоступный сетевой ресурс. При этом во время обновления программы, достаточно заменить модули программы в одном месте. Но тут мы наталкиваемся на ряд проблем, самой существенной из которых, является освобождение программы пользователями для снятия блокировки записи.

Самым простым решением данной проблемы является дозванивание к пользователям по телефону, или рассылка сообщений с просьбой выйти из программы. Способ конечно действенный, но утомительный. Да и порой пользователей не удается застать на рабочем месте. То ли ушли на обед, а может, компьютер забыли выключить...

Данный материал не решает проблему на все сто процентов, так как при работе в DOS сессии старых CLIPPER’ных программ “многозадачная” ОС Windows 98 забывает про остальные процессы, но значительно облегчает жизнь (звонить приходится поменьше). Алгоритм достаточно простой. Периодически по таймеру программа считывает дату и время завершения, и при превышении заданного времени автоматически завершает заботу. При этом пользователю выдается соответствующее сообщение. Для вывода сообщения используется предварительно созданная html страничка, вывод которой осуществляется независимым процессом в Web браузере на клиентском компьютере.

//Метод вызова по таймеру
procedure TfrmMain.DigitalClockHalfPast(Sender: TObject;
  DDGTime: TDateTime);
begin
  CheckExpiredTime(Sender);
end;

//Обработчик контроля завершения программы
procedure TfrmMain.CheckExpiredTime(Sender:TObject);
var
  closeAppFileName, tmpStr:String;
  fTextFile:TextFile;
begin
 if DM.IsExpiredTime then
    begin
      tmpStr:=ExtractFilePath(Application.ExeName);
      closeAppFileName:=IncludeTrailingBackslash(tmpStr)
         +'CloseProgram.htm';
      //Контроль на наличие файла сообщения
      //и попытка создания при его отсутствии
      if not FileExists(closeAppFileName) then
        try
          AssignFile(fTextFile,closeAppFileName);
          ReWrite(fTextFile);
          Writeln(fTextFile,'<html>');
          Writeln(fTextFile,'<head>');
          Writeln(fTextFile,'<title>Сообщение программы БС-Сервис</title>');
          Writeln(fTextFile,'<meta http-equiv=Content-Type content="text/html; charset=windows-1251">');
          Writeln(fTextFile,'</head>');
          Writeln(fTextFile,'<body>');
          Writeln(fTextFile,'<p>Программа закрыта для администрирования</p>');
          Writeln(fTextFile,'<p>до 15<sup>30</sup></p>');
          Writeln(fTextFile,'</body>');
          Writeln(fTextFile,'</html>');
          CloseFile(fTextFile);
        except
          on E: Exception do
            LogError(E.Message,['']);
        end;
      if FileExists(closeAppFileName) then
        //вывод сообщения. RX-lib функция запуска внешнего процесса
        FileExecute('closeProgram.htm','',ExtractFilePath(Application.ExeName),esNormal);
      //Завершение работы программы
      actApplicationExitExecute(Sender);
    end;
end;
//Функция чтения времени завершения програмы из
//ini файла параметров
function TDM.IsExpiredTime:boolean;
var
  iniFileName,timeStr:String;
  FIniFile: TIniFile;
  pIni: TObject;
  FTextFile:TextFile;
  expiredTime:TDateTime;
begin
  pIni:=nil;
  iniFileName:=ChangeFileExt(ParamStr(0), '.ini');
  Result:=false;
  //если ini файл не найден, то создаем
  if not FileExists(iniFileName) then 
     begin
      AssignFile(FTextFile,iniFileName);
      ReWrite(FTextFile);
      CloseFile(FTextFile);
    end;
  try
    pIni := TIniFile.Create(iniFileName);
    FIniFile := TIniFile(pIni);
    try
      //Читаем переменную ExpiredTime
      //в разделе CFG
      timeStr:=FIniFile.ReadString('CFG','ExpiredTime','31/12/4712 00:00:00');
      expiredTime:=StrToDateFmt('DD/MM/YYYY HH:MM:SS', timeStr);
      if Now >= expiredTime then
        Result:=true;
    except
      Result:=false;
    end;
  finally
    pIni.Destroy;
  end
end;

Скачать модуль bs_lib

Rambler's Top100 Рейтинг@Mail.ru