Delphi 3. Библиотека программиста

       

Запрет выполнения программы


Дневник №16, 2 апреля. Итак, я узнал, как предотвратить выполнение программы при наличии предыдущего экземпляра. Но что-то продолжало беспокоить меня. А что если приложение должно работать лишь в том случае, если одновременно с ним работает какая-то другая программа?

В некоторых программах могут использоваться демонстрационные версии компонентов — например из VCL-библиотеки Orpheus. Если приложение создается с использованием того, что TurboPower Software называет «пробными» (trial) версиями компонентов, то оно сможет работать лишь одновременно с Delphi IDE. Как это делается?

?ис. 16.4. Программа, обнаруживающая присутствие Delphi во время работы

Ответ был настолько прост, что я не сразу в него поверил. На рис. 16.4 показано, как может выглядеть такая программа. В листинге 16.5 приведен исходный текст главной формы, а в листинге 16.6 — файл проекта.

Листинг 16.5. Исходный текст главной формы приложения,

обнаруживающего присутствие Delphi

{——————————————————————————————————————————————————————} { Демонстрационная программа, } { обнаруживающая присутствие Delphi. } { NRUNMAIN.PAS : Главная форма } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора } { } { Главная форма приложения, работающего лишь при } { условии одновременной работы 32-разрядной версии } { Delphi. } { } { Написано для *High Performance Delphi 3 Programming* } { Copyright (c) 1997 The Coriolis Group, Inc. } { Дата последней редакции 30/4/97 } {——————————————————————————————————————————————————————} unit NRunMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WalkStuf; type TForm1 = class(TForm) ExitBtn: TButton; Label1: TLabel; procedure ExitBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.ExitBtnClick(Sender: TObject); begin Close; end; end.

Листинг 16.6. Файл проекта для приложения, обнаруживающего

присутствие Delphi

{——————————————————————————————————————————————————————} { Демонстрационная программа, } { обнаруживающая присутствие Delphi. } { NORUN.DPR : Главная форма } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора } { } { Приложение, работающее лишь при условии } { одновременной работы 32-разрядной версии Delphi. } { } { Написано для *High Performance Delphi 3 Programming* } { Copyright (c) 1997 The Coriolis Group, Inc. } { Дата последней редакции 30/4/97 } {——————————————————————————————————————————————————————} program NoRun; uses Forms, Dialogs, NRunMain in 'NRunMain.pas' {Form1}, WalkStuf in 'WalkStuf.pas'; {$R *.RES} begin Application.Initialize; { Если не существует работающего экземпляра 32-разрядной версии Delphi, вывести сообщение об ошибке и завершить работу программы. Если все хорошо, продолжить выполнение. } if ModuleSysInstCount('DELPHI32.EXE') < 1 then MessageDlg('Delphi 32 must be running to execute this program', mtError, [mbOK], 0) else begin Application.CreateForm(TForm1, Form1); Application.Run; end; end.

Основная идея — уничтожить приложение еще до того, как пользователь увидит главную форму. Для решения этой задачи я снова включил код непосредственно в файл проекта. На этот раз функция ModuleSysInstCount из модуля WalkStuf проверяет, работает ли в системе по меньшей мере один экземпляр 32-разрядной версии Delphi (DELPHI32.EXE). Если проверка дает положительный результат, программа продолжает работу, если нет — выводится сообщение об ошибке.

Небольшое замечание: поскольку в модуле WalkStuf используется Tool Help32, описанная методика будет работать лишь в Win95.

Конец записи (2 апреля).



Содержание раздела