Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/65: Рейтинг темы: голосов - 65, средняя оценка - 4.85
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034

Запрет двойного запуска

07.05.2013, 22:50. Показов 15669. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некий код и если свое я приложение запустил выскочит окошко Óæå çàïóøåíî а затем все равно запустится приложение.
Как сделать код чтоб приложение можно было запустить только 1 раз!?
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCreate(Sender: TObject);
VAR
 HM: THandle;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'CdpApp');
if (HM <>0 ) then
ShowMessage('Óæå çàïóøåíî');
if HM = 0 then
  HM := CreateMutex(nil, false, 'CdpApp');
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2013, 22:50
Ответы с готовыми решениями:

Запрет запуска второй копии
Здравствуйте, пытаюсь запретить запуск второй копии с активацией окна (вывода на передний план свернутого окна) program Project1; ...

Запрет запуска более 1 копии программы
Здраствуйте я хотел бы узнать как сделать так чтобы запретить запуск 2 окна программы! &quot;Пример&quot; Я сделал программу, и могу...

Delphi: Запрет запуска второй копии разными пользователями!
Данная тема здесь создавалась неоднократно, но варианты запрета, которые здесь приводились подходят только при попытке запуска одним...

33
angstrom
08.05.2013, 11:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Твой код работает
Уточняй к кому обращаешься.
Эксперт Pascal/Delphi
 Аватар для droider
4893 / 2826 / 867
Регистрация: 04.10.2012
Сообщений: 10,278
08.05.2013, 11:20
angstrom, видно ко мне))
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
08.05.2013, 11:29  [ТС]
Да да твой код ))) вот этот вот:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.FormCreate(Sender: TObject);
var
 h:THandle;
begin
//создаем мьютекс для запрета вторичного запуска
h := CreateMutex(nil, True, PChar(ExtractFileName(ParamStr(0))));
if WaitForSingleObject(h, 0)<>0 then  //прерываем процесс при попытке повторного запуска
begin
ShowMessage('Повторный запуск запрещен'); //вывод сообщения
Application.Terminate;
CloseHandle(h);
end;
end;
 
end.
0
Эксперт Pascal/Delphi
 Аватар для droider
4893 / 2826 / 867
Регистрация: 04.10.2012
Сообщений: 10,278
08.05.2013, 11:37
NIKOLAYY, я в курсе о каком коде речь
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
08.05.2013, 11:43
Вариант проверки без запуска приложения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
program Project1;
 
uses
  Forms,
  Windows,
  SysUtils,
  Dialogs,
  Unit1 in 'Unit1.pas' {Form1};
 
var
 hMutex: THandle;
 
{$R *.res}
 
begin
  // Ñîçäàåì ìüþòåêñ äëÿ çàïðåòà çàïóñêà âòîðîãî ýêçåìïëÿðà ïðèëîæåíèÿ
  hMutex := CreateMutex(nil, True, PChar(ExtractFileName(ParamStr(0))));
 
  if GetlastError <> ERROR_ALREADY_EXISTS then // ïðåðûâàåì ïðîöåññ ïðè ïîïûòêå ïîâòîðíîãî çàïóñêà
//  if WaitForSingleObject(hMutex, 0) = 0 then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
 
    ReleaseMutex(hMutex);
  end else
  begin
    ShowMessage('Ïîâòîðíûé çàïóñê çàïðåùåí!');
    CloseHandle(hMutex);
  end;
end.
проверено на Win XP SP3 и Win 7
1
angstrom
08.05.2013, 11:52
Основы этого кода ТС даны, но он ему не понравился.
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
08.05.2013, 12:09
Цитата Сообщение от angstrom Посмотреть сообщение
Основы этого кода ТС даны, но он ему не понравился.

Не по теме:

Может он просто приготовил его неправильно. :D

0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
08.05.2013, 12:26  [ТС]
Да не, код мне понравился я просто чтобы надежно он работал и все еще думаю какой выбрать),
Просто я подумал а вдруг не одна копия а 50 или 100 или еще более будет и страшно подумать что будет если (они самоликвидироваться правильно не будут)
Все это висеть гдето в памяти будет!

Важно чтобы ни что не висело!

Добавлено через 15 минут
Давай вот эту часть еще доработаем - мне всплывающее окно ненужно
Delphi
1
2
3
4
5
6
7
 ReleaseMutex(hMutex);
  end else
  begin
    ShowMessage('Повторный запуск запрещен!');
    CloseHandle(hMutex);
  end;
end.
Так нормально будет работать?
Delphi
1
2
3
4
5
6
 ReleaseMutex(hMutex);
  end else
  begin
    CloseHandle(hMutex);
  end;
end.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
08.05.2013, 12:31
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Так нормально будет работать?
Нормально.
1
7 / 7 / 4
Регистрация: 24.08.2011
Сообщений: 313
09.05.2013, 10:52
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Есть некий код и если свое я приложение запустил выскочит окошко Óæå çàïóøåíî а затем все равно запустится приложение.
Как сделать код чтоб приложение можно было запустить только 1 раз!?
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCreate(Sender: TObject);
VAR
 HM: THandle;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'CdpApp');
if (HM <>0 ) then
ShowMessage('Óæå çàïóøåíî');
if HM = 0 then
  HM := CreateMutex(nil, false, 'CdpApp');
end;
Я наверное правильно понял, запрет запуска одной и той же программы несколько раз. Вот код!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  h : THandle;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
if WaitForSingleObject(h, 0)<>0 then
begin
MessageBox(Self.Handle, 'Вы уже запустили НАЗВАНИЕ ПРОГРАММЫ', 'Ошибочка', mb_IconError);
Application.Terminate;
end
end;
 
initialization
h := CreateMutex(nil, True, PChar(ExtractFileName(Application.ExeName)));
finalization
CloseHandle(h);
 
end.
1
Эксперт Pascal/Delphi
 Аватар для droider
4893 / 2826 / 867
Регистрация: 04.10.2012
Сообщений: 10,278
09.05.2013, 14:58
KaZaK555, Вы бы сначала предыдущие ответы посмотрели
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.06.2013, 12:08
Чтобы ограничить запуск других копий приложения по всей системе, кода с мьютексом и
проверкой на ERROR_ALREADY_EXISTS недостаточно.

Во-первых, именованные объекты ядра, такие как мьютексы, по умолчанию записываются в
локальные пространства имен. Каждый залогиненный пользователь имеет свое пространство
имен, а имена объектов из других сессий ему не видны. И если запустить программу с
мьютексом под одним пользователем, затем переключиться на другого и запустить там
ее второй экземпляр, она будет работать, как ни в чем не бывало, так как в каждой
пользовательской сессии будет своя копия мьютекса и проверка не сработает.

Чтобы объект был общим для всех пользовательских сессий, он должен быть создан в
глобальном пространстве имен, для этого следует использовать префикс "Global".
Например, "Global\MyMutex".

Во-вторых, для открытия объекта, созданного процессом из другого контекста
безопасности, например под другим пользователем, не всегда может хватить прав.
И тогда CreateMutex или OpenMutex будут завершаться с GetLastError == 5 (access denied,
нет доступа). Решения тут два: первое правильное, но несколько занудное, второе простое,
но не гарантирующее точность. Первое решение заключается в том, чтобы создавать мьютекс с
уже настроенным дескриптором безопасности, в котором были бы нужные разрешения.
Например, можно разрешить полный доступ для группы "Everyone" (все), тогда мьютекс
смогут открывать все, кто захочет. Второе решение - при создании/открытии мьютекса
реагировать на код ошибки ERROR_ACCESS_DENIED (5) так же, как и на ERROR_ALREADY_EXISTS.

Ну и в-третьих, желательно каким-то образом гарантировать, что имя мьютекса действительно
является уникальным, хотя бы в пределах системы. Для этого обычно применяют GUID-форму:
"Global\{F493B8D8-8315-4874-9800-17AE970864BA}". Генерировать GUID-ы (уникальные в
пределах планеты !) умеет утилита Guidgen из состава Windows SDK, если кто не знает.

В итоге должен получиться примерно следующий код:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Вариант 1.
 
Создаем дескриптор безопасности.
Добавляем в него полный доступ для группы "Everyone" (SID: S-1-1-0).
Создаем именованный мьютекс с префиксом "Global" в имени и дескриптором
безопасности, созданным на предыдущем шаге.
Если мьютекс создан, а GetLastError возвращает значение, не равное
ERROR_ALREADY_EXISTS, значит это первая копия приложения.
 
Вариант 2.
 
Создаем именованный мьютекс с префиксом "Global" в имени.
Если мьютекс создан, проверяем на GetLastError == ERROR_ALREADY_EXISTS, а
если нет, проверяем на GetLastError == ERROR_ACCESS_DENIED.
Если хотя бы одно из двух условий сработало, это не первая копия приложения.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
04.06.2013, 16:58
Цитата Сообщение от Убежденный Посмотреть сообщение
Каждый залогиненный пользователь имеет свое пространство
имен...
А кто сказал, что разные пользователи не должны иметь возможности запустить свой экземпляр приложения?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.06.2013, 17:47
Верное замечание.
Просто я предложил несколько шире взглянуть на вопрос
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2013, 17:47

Запрет двойного клика в Listbox
Добрый день, форумчане! Возник следующий вопрос. Есть ListBox, в котором данные. Несколько столбцов (Columns). По двойному клику...

Запрет запуска
Всем привет! Скажите, что нужно прописать в реестре для запрета запуска какой-нибудь игры или другого приложения. sorry, если есть уже...

Запрет запуска regedit
Добрый вечер. Подскажите, как запретить запуск regedit пользователям с учеткой &quot;Обычный пользователь&quot;? Кстати, может им можно...

Запрет запуска приложения
Люди помогите пожалуйста,нужно запретить запуск определенного приложения допустим *.exe(программно на с++\builder) Заранее блогодарен.

Запрет запуска приложений
Как сделать программу ,чтобы она блокировала запуск определенных программы.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru