Секреты Delphi. Принудительное завершение программы для администрирования
Секреты Delphi. Принудительное завершение программы для администрирования
Для упрощения администрирования при работе с сетевой версией программы чаще всего исполняемые модули выкладываются в общедоступный сетевой ресурс. При этом во время обновления программы достаточно заменить ее модули в одном месте. Но тут мы наталкиваемся на ряд проблем, самой существенной из которых является освобождение программы пользователями для снятия блокировки записи.
Самым простым решением данной проблемы является дозванивание к пользователям по телефону или рассылка сообщений с просьбой выйти из программы. Способ, конечно, действенный, но утомительный.
Да и порой пользователей не удается застать на рабочем месте. То ли ушли на обед, а может, компьютер забыли выключить...
Данный материал не решает проблему на все сто процентов, так как при работе в DOS сессии старых CLIPPER'ных программ "многозадачная" ОС Windows 98 забывает про остальные процессы, но значительно облегчает жизнь (звонить приходится поменьше).
Алгоритм достаточно простой. Периодически по таймеру программа считывает дату и время завершения и при превышении заданного времени автоматически завершает работу.
При этом пользователю выдается соответствующее сообщение. Для вывода сообщения используется предварительно созданная HTML-страничка, вывод которой осуществляется независимым процессом в web-браузере на клиентском компьютере.
http://bs_elbis.at.tut.by
Для упрощения администрирования при работе с сетевой версией программы чаще всего исполняемые модули выкладываются в общедоступный сетевой ресурс. При этом во время обновления программы достаточно заменить ее модули в одном месте. Но тут мы наталкиваемся на ряд проблем, самой существенной из которых является освобождение программы пользователями для снятия блокировки записи.
Самым простым решением данной проблемы является дозванивание к пользователям по телефону или рассылка сообщений с просьбой выйти из программы. Способ, конечно, действенный, но утомительный.
Да и порой пользователей не удается застать на рабочем месте. То ли ушли на обед, а может, компьютер забыли выключить...
Данный материал не решает проблему на все сто процентов, так как при работе в 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
Компьютерная газета. Статья была опубликована в номере 49 за 2003 год в рубрике программирование :: delphi