powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запрет на повторгый запуск программы.
8 сообщений из 8, страница 1 из 1
Запрет на повторгый запуск программы.
    #32304997
Dmitry07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, как запретить программе запускаться, если эта программа уже открыта.
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32305030
Andrei_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На прошлой неделе набрал в поисковике этот вопрос. Ответов просто туча - сразу готовый код - несколько вариантов. Просто скопируй и все.

Вот вроде что-то подобное

Код: plaintext
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.
program Tree;

uses
  Forms,
  Windows,
  TreeDecl in 'TreeDecl.pas' {Base};

{$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');
end;


begin
  if Check then Exit;

  Application.Initialize;
  Application.CreateForm(TBase, Base);
  Application.Run;
end.
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32305031
Andrei_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На прошлой неделе набрал в поисковике этот вопрос. Ответов просто туча - сразу готовый код - несколько вариантов. Просто скопируй и все.

Вот вроде что-то подобное

Код: plaintext
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.
program Tree;

uses
  Forms,
  Windows,
  TreeDecl in 'TreeDecl.pas' {Base};

{$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');
end;


begin
  if Check then Exit;

  Application.Initialize;
  Application.CreateForm(TBase, Base);
  Application.Run;
end.
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32305587
Mongrel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
program Payment;

uses
Windows,
Dialogs,
Forms,
Unit1 in 'Unit1.pas' {Form1},

{$R *.RES}

var UniqeMapping : THandle;

begin
UniqeMapping := CreateFileMapping($ffffffff, nil, Page_ReadOnly, 0, 32, 'MyPayment');
if UniqeMapping = 0 then
begin
ShowMessage('Ошибка выделения памяти!');
Halt;
end
else
if GetLastError = Error_Already_Exists then
begin
ShowMessage('Вторую копию программы запускать нельзя!');
Halt;
end;

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32305610
Mongrel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я раньше, кстати, через FindWindow делал.
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32305698
Фотография SmaLL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорят через FindWindow нежелательно делать
Рекомендуется делать через мьютексы
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32307203
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекомендуется делать через мьютексы
А можно и через отображенный в память файл. Его можно использовать как общую память с другими процессами.

Код: plaintext
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.
program Prg;

uses
  Forms,
  Windows,
  SysUtils,
// ...

var FirstHandle: THandle;
     FirstWindow: THandle;
begin

  FirstHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY,  0 ,  32 , 'Prg');
  if FirstHandle  =  0  then
    begin
      ShowMessage('Ошибка выделения памяти'+# 13 # 10 +SysErrorMessage(GetLastError));
      Halt;
    end
	else if GetLastError = ERROR_ALREADY_EXISTS then
		begin
			FirstWindow := FindWindowEx( 0 ,  0 , PChar(string(TFormMain.ClassName)), nil);  // получить окно предыдущей копии
			if FirstWindow <>  0  then
				SetForegroundWindow(FirstWindow);
        ShowWindow(FirstWindow, SW_MAXIMIZE);  // Переключить на это окно
			Halt;
		end;

  try
  	Application.Initialize;
	  Application.ShowMainForm := false;
  	Application.CreateForm(TFormMain, FormMain);
    Application.Run;
  finally
  end;
end.
...
Рейтинг: 0 / 0
Запрет на повторгый запуск программы.
    #32309474
Stepan_mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал как сказал Andrei_A

HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex');

Result := (HM <> 0);
В любом случає у меня Hm = 0 Почему?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запрет на повторгый запуск программы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]