Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

Как запретить многократный запуск процесса?   Найти похожие ветки 

 
DROWSY ©   (2006-09-29 19:01) [0]

Как в программе проверить запущен ли уже в системе её экземпляр и запретить исполнение "дубля"?


 
X9 ©   (2006-09-29 20:01) [1]

Напрмер так.
При запуске программы пытаемся создать семафор (мьютекс). Если таковой уже имеется - закрывыаемся.

program Project1;

uses
 Forms,
 Unit1 in "Unit1.pas" {Form1},
 Windows;

{$R *.res}

var
 hMutex: Integer;

begin
 hMutex := CreateMutex(nil, True, "My program mutex");
 if GetLastError <> 0 then
 begin
   MessageBox(0, "Нельзя запустить программу дважды.", "Предупреждение", MB_OK or MB_ICONWARNING);
   Halt;
 end;
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
 ReleaseMutex(hMutex);
end.


 
Fay ©   (2006-09-29 23:35) [2]

2 X9 ©   (29.09.06 20:01) [1]
1) почему hMutex Integer, а не THandle какой-нибудь?
2) Зачем ReleaseMutex в самом конце?
3) Где проверка hMutex на 0.
4) ERROR_ALREADY_EXISTS - не единственная возможная ошибка.


 
Мурзилка   (2006-09-29 23:47) [3]

program Project1;

uses
 Forms,
 Windows,
 Unit1 in "Unit1.pas" {Form1},

{$R *.res}

var
 HM: THandle;

function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, "MyOwnMutex");
Result := (HM <> 0);
if HM = 0
 then HM := CreateMutex(nil, false, "MyOwnMutex")
 else Application.MessageBox("Программа уже запущена!", "Предупреждение",
                             MB_OK + MB_ICONEXCLAMATION+MB_DEFBUTTON1);
end;

begin
 Application.Initialize;
 if Check then Exit; //проверка на повторный запуск программы
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


 
X9 ©   (2006-09-30 05:02) [4]

> [2] Fay ©   (29.09.06 23:35)
Я хотел упростить :)
В данному слаучае, IMHO, не имеет особого значения - THandle или Integer.
А ставить проверки на все возможные ошибки - дело автора программы.

Я лишь показал, в какую сторону копать.


 
Loginov Dmitry ©   (2006-09-30 10:05) [5]

Можно совсем просто:

CreateMutex(nil, {True | False}, "My program mutex");
if GetLastError = ERROR_ALREADY_EXISTS then Halt;

В принципе, ничего другого не нужно, и лишнего тоже ничего нет. Закрывать указатель не требуется, он будет закрыт автоматически.


 
Desdechado ©   (2006-09-30 15:00) [6]

в FAQ http://www.delphimaster.ru/faq.shtml есть много вариантов для сабжа, в том числе и с мьютексами


 
Сергей М. ©   (2006-09-30 20:55) [7]


> Как запретить многократный запуск процесса?


В общем случае - никак.



Страницы: 1 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
15-1159115578
Konstantin555
2006-09-24 20:32
2006.10.15
HELP! После установки Касперского пропала сеть и Интернет!


15-1158933375
Oldman
2006-09-22 17:56
2006.10.15
Актёр Семен Фарада находится в реанимации


2-1159268728
TrainerOfDolphins
2006-09-26 15:05
2006.10.15
DBNavigator вертикально


2-1159175122
Серый
2006-09-25 13:05
2006.10.15
Сообщение об ошибке


2-1159297596
oRion_rz
2006-09-26 23:06
2006.10.15
Блокировка