Главная страница
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.041 c
1-1157509175
dimon1
2006-09-06 06:19
2006.10.15
Нужна помощь


3-1155644577
RomanH
2006-08-15 16:22
2006.10.15
Начальное значение генератора


2-1159378202
berezne
2006-09-27 21:30
2006.10.15
Запуск БД без принтера


1-1157712245
TakTak
2006-09-08 14:44
2006.10.15
поместить в автозагрузку программу.


15-1159108905
Проггер из библиотеки
2006-09-24 18:41
2006.10.15
Информация о мониторе Samtron 76 BDF