Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как запретить многократный запуск процесса? [D6, 2000]


DROWSY ©   (2006-09-29 19:01:00) 

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


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


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


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


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

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


Loginov Dmitry   (2006-09-30 10:05:00) [3]

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

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

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


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

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

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


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

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.


Fay   (2006-09-29 23:35:00) [6]

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


X9   (2006-09-29 20:01:00) [7]

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

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо