|
Вопрос # 3 162/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста как реализовать проверку, запущена ли уже программа(работает в данный момент), которую пытается запустить пользователь?
Сейчас пишу программу которая должна быть запущенна на компьютере в единственном экземпляре и не знаю как это реализовать.
(если это имеет значение в программе используется несколько форм и компонент CoolTrayIcon)
Заранее огромное спасибо за ответ!
 |
Вопрос задал: Сергей FausT Елфимов (статус: Посетитель)
Вопрос отправлен: 8 сентября 2009, 23:14
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Паровоз
Здравствуйте, Сергей FausT Елфимов!
Один из вариантов - при запуске программы создавать именованный объект ядра (например, мьютекс) и проверять его существование. Если он уже существует, то запускается копия программы.
 |
Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 8 сентября 2009, 23:24
Оценка за ответ: 2
Комментарий к оценке: Данный метод действительно работает спасибо.
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Сергей FausT Елфимов!
Простой и красивый способ - через именнованный семафор. Например в FormCreate для главной формы добавляем такой код
procedure TForm1.FormCreate(Sender: TObject);
var
Sem: THandle;
begin
Sem := CreateSemaphore(nil, 0, 1, 'PROGRAM_NAME');
if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
begin
CloseHandle(Sem);
ShowMessage('This program is already running.');
Halt;
end;
end;
вместо 'PROGRAM_NAME' лучше вставить свою строку, а то может быть, что две разные программы не смогут быть запущенны вместо. Что бы получить достаточно уникальную строку, в редакторе делфи жмем Ctrl+Shift+G и удаляем оттудова кавычки. получиться что то вида '{D871DA61-4B10-4E8C-BAA8-6848A178BBF9}'
а можно через мютекс.
var
mHandle: THandle; // Mutexhandle
initialization
mHandle := CreateMutex(nil, True, 'XYZ');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Program is already running!');
halt;
end;
finalization
if mHandle <> 0 then CloseHandle(mHandle)
end.
этот код достаточно дописать в конце юнита главной формы (end с точкой там уже будет).
Дальнейшую модификацию кода надо делать по собственному вкусу.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 8 сентября 2009, 23:28
Оценка за ответ: 5
Комментарий к оценке: Огромное вам спасибо за ответ.
Всё прекрасно работает!
|
Мини-форум вопроса
Всего сообщений: 25; последнее сообщение — 10 сентября 2009, 21:12; участников в обсуждении: 5.
Страницы: [« Предыдущая] [1] [2]
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 18:02 [#21]:
Дело не в этом, а в том, что индивидуальный подход возможен только в диалоге, т.е. на миниформуме. Отвечая на вопрос, Вы не могли знать уровень и возможности спрашивающего. Именно поэтому Ваше утверждение об индивидуальном подходе звучит совершенно неуместно.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 18:04 [#22]:
Разве я не писал о девятом чувстве? И почему такая уверенность, что я не мог? Ещё как мог. А вдруг я успел в аську постучаться и пообщаться?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 18:06 [#23]:
Вадим, ставить все время себя над другими - плохая черта Вашего характера.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 18:10 [#24]:
Ну так бы сразу написали, а то выставили себя далеко не в лучшем свете.
Да, и я часто ошибаюсь, потом думаю, как я так мог, сделать такую глупость. Но вот только я не спорю, если хорошо не подготовлюсь.
Всё, хватит, закрываем этот флейм.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 10 сентября 2009, 21:12 [#25]:
"выставили себя далеко не в лучшем свете"
Наоборот, это Вы выставили себя не в лучшем свете.
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|