Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2008, 05:01   #1
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию [РЕШЕНО] Запрет запуска второй копии программы

Господа, не могу вспомнить, как сабж... Напомните...Через WinApi или все едино. Чето-там через FindWindowEx...? , Да и в какое место этот код вставлять... )

Решений очень много ниже

Последний раз редактировалось Вадим Мошев; 19.11.2018 в 21:04.
Ash вне форума Ответить с цитированием
Старый 18.11.2008, 05:55   #2
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Это лучше всего вставлять в файл проджекта (*.dpr) перед инициализацией приложений и созданием форм
Код:
var
h: HWND;
begin
   h := findWindow('{здесь вводишь имя класса окна, например tForm1, или оставляешь nil}', 
      {здесь вводишь заголовок окна (caption), например Form1, или оставляешь nil (если он может меняться)});
   if h <> 0 then exit;

   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
end.
Altera вне форума Ответить с цитированием
Старый 18.11.2008, 08:15   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Вот так тоже работает и не зависит от заголовка окна
Код:
Var HM :THandle;

function Check: boolean;
begin
  HM:=OpenMutex(MUTEX_ALL_ACCESS, false, 'Proj');
  Result:=(HM<>0);
  if HM=0 then HM:=CreateMutex(nil, false, 'Proj');
end;

begin
    // Проверка на запуск второй копии программы
    If Check then
    exit;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
FaTaL вне форума Ответить с цитированием
Старый 18.11.2008, 09:40   #4
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию

Спасибо, сэкономили время, которого ужасно мало
Ash вне форума Ответить с цитированием
Старый 18.11.2008, 12:49   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Мой любимый способ:

Код:
CheckEvent: TEvent;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckEvent:= TEvent.Create( nil, false, true, 'MYPROJECT_CHECKEXIST' );
If CheckEvent.WaitFor(10)<>wrSignaled then
begin
ShowMessage('Сколько можно запускать одну и ту же программу ?');
Halt;
end else
...
(Кстати, как и многое, описан в моей подписи. Зря не пользуетесь...)

в секцию uses вписать SynCobJs

Последний раз редактировалось Вадим Мошев; 19.11.2018 в 21:05.
mihali4 вне форума Ответить с цитированием
Старый 18.11.2008, 13:49   #6
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

А конкретней о tEvent? Где можно прочитать больше?

Последний раз редактировалось Altera; 18.11.2008 в 13:57.
Altera вне форума Ответить с цитированием
Старый 18.11.2008, 14:08   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
А конкретней о tEvent? Где можно прочитать больше?
Методика получения знаний стандартная: пишем в юните "tEvent", ставим на нее курсор и жмем пимпу F1. Дельфи начинает рассказывать, а наше дело - внимать...
mihali4 вне форума Ответить с цитированием
Старый 18.11.2008, 18:16   #8
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Я обычно использую такой способ:
Код:
Procedure OnlyOne;
Begin
CreateMutex(Nil, True, '999');
If GetLastError <> 0 Then
Begin
Halt;
End;
End;
Procedure TForm1.FormCreate(Sender: TObject);
Begin
OnlyOne;
End;
Код очень простой. Быстро выполняется и замечательно работает. Не требует никаких заголовков программы и ничего лишнего.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 18.11.2008, 19:24   #9
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию

Блин, столько способов испробовать мне уже не позволит Камасутра времени... Попробую первый, WinAPI велик и добр...
Ash вне форума Ответить с цитированием
Старый 17.04.2017, 10:56   #10
Новиков Сергей
Новичок
Джуниор
 
Регистрация: 02.05.2011
Сообщений: 2
По умолчанию

Код:
CheckEvent: TEvent;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckEvent:= TEvent.Create( nil, false, true, 'MYPROJECT_CHECKEXIST' );
If CheckEvent.WaitFor(10)<>wrSignaled then
begin
ShowMessage('Сколько можно запускать одну и ту же программу ?');
Halt;
end else
...
Пожалуйста, оформляйте Ваш код согласно правилам.

в секцию uses вписать SynCobJs

Последний раз редактировалось Вадим Мошев; 19.11.2018 в 16:19.
Новиков Сергей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрет запуска приложений kostya67 Общие вопросы Delphi 4 29.10.2013 18:31
Запрет запуска второй копии программы unbanned Общие вопросы Delphi 0 26.09.2013 19:55
как разрешить запуск второй копии чужого приложения s1s1s1 Общие вопросы Delphi 4 02.11.2011 01:47
Запрет запуска программы на VBA в случае если Excel уже открыт kovalevskivf Microsoft Office Excel 4 01.09.2009 11:22