...
...

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

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

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

Самым простым решением данной проблемы является дозванивание к пользователям по телефону или рассылка сообщений с просьбой выйти из программы. Способ, конечно, действенный, но утомительный.
Да и порой пользователей не удается застать на рабочем месте. То ли ушли на обед, а может, компьютер забыли выключить...
Данный материал не решает проблему на все сто процентов, так как при работе в DOS сессии старых CLIPPER'ных программ "многозадачная" ОС Windows 98 забывает про остальные процессы, но значительно облегчает жизнь (звонить приходится поменьше).
Алгоритм достаточно простой. Периодически по таймеру программа считывает дату и время завершения и при превышении заданного времени автоматически завершает работу.
При этом пользователю выдается соответствующее сообщение. Для вывода сообщения используется предварительно созданная HTML-страничка, вывод которой осуществляется независимым процессом в web-браузере на клиентском компьютере.

//Метод вызова по таймеру procedure TfrmMain.DigitalClockHalfPast (Sender: TObject; DDGTime: T
DateTime); begin CheckExpiredTime(Sender); end; //Обработчик контроля завершения программы procedure
 TfrmMain.CheckExpiredTime (Sender:TObject); var closeAppFileName, tmpStr:String; fTextFile:TextFile
; begin if DM.IsExpiredTime then begin tmpStr:=ExtractFilePath(Applica-tion.ExeName); closeAppFileNa
me:=IncludeTrailing Backslash(tmpStr) +'CloseProgram.htm'; //Контроль на наличие файла сообщения и п
опытка создания при его отсутствии if not FileExists(closeAppFileNa-me) then try AssignFile(fTextFil
e,closeApp FileName); ReWrite(fTextFile); Writeln(fTextFile,'<html>'); Writeln(fTextFile,'<
head>'); Writeln(fTextFile,'<title>Сообщение программы БС-Сервис</title>'); Writeln(f
TextFile,'<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>3
0</sup></p>'); Writeln(fTextFile,'</body>'); Writeln(fTextFile,'</html>'); C
loseFile(fTextFile); except on E: Exception do LogError(E.Message,['']); end; if FileExists(closeApp
FileName) then //вывод сообщения. RX-lib функция запуска внешнего процесса FileExecute('closeProgram
.htm', '',ExtractFilePath(Application.ExeName), esNormal); //Завершение работы программы actApplicat
ionExitExecute(Sender); end; end; //Функция чтения времени завершения програмы из ini файла параметр
ов function TDM.IsExpiredTime:boolean; var iniFileName,timeStr:String; FIniFile: TIniFile; pIni: TOb
ject; FTextFile:TextFile; expiredTime:TDateTime; begin pIni:=nil; iniFileName:=ChangeFileExt(ParamSt
r(0), '.ini'); Result:=false; //если ini-файл не найден, то создаем if not FileExists(iniFileName) t
hen 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:=S
trToDateFmt('DD/MM/ YYYY HH:MM:SS', timeStr); if Now >= expiredTime then Result:=true; except Res
ult:=false; end; finally pIni.Destroy; end end;
Сергей Бердачук, Berdachuk@tochka.by,
http://bs_elbis.at.tut.by



© Компьютерная газета

полезные ссылки
Аренда ноутбуков