![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запретить многократный запуск процесса? [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.