Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 162

Раздел: Delphi » Прочее
/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста как реализовать проверку, запущена ли уже программа(работает в данный момент), которую пытается запустить пользователь?
Сейчас пишу программу которая должна быть запущенна на компьютере в единственном экземпляре и не знаю как это реализовать.
(если это имеет значение в программе используется несколько форм и компонент CoolTrayIcon)
Заранее огромное спасибо за ответ!

Сергей FausT Елфимов Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сергей 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]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 00:12
Выполнено за 0.03 сек.