Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/139: Рейтинг темы: голосов - 139, средняя оценка - 4.91
7 / 7 / 4
Регистрация: 24.08.2011
Сообщений: 313

Запрет запуска более 1 копии программы

12.09.2011, 14:06. Показов 30981. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте я хотел бы узнать как сделать так чтобы запретить запуск 2 окна программы!
"Пример"
Я сделал программу, и могу запускать ее бесконечно раз во многих окнах. как запретить такую возможность и сделать так что запустить можно только 1 программу при запуске второй выдавалась бы ошибка)) Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2011, 14:06
Ответы с готовыми решениями:

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

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

Отработка запуска копии программы
Добрый день. При повторном запуске программы не разворачивается форма из трея. Подскажите, где ошибка? Спасибо. program RanD; ...

41
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
03.04.2012, 12:07
Студворк — интернет-сервис помощи студентам
Ну так то есть отличия например, ты предлагаешь код вставлять в событие создание главного окна, а там перед инициализацией программы, что по мне гораздо лучше, и твой код не сразу работать стал, ну там мои косяки
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
03.04.2012, 12:21
Цитата Сообщение от ilya-vlas Посмотреть сообщение
ты предлагаешь код вставлять в событие создание главного окна
О_о где я это предлагаю?
я же писал уже 2 раза "размещаешь его до создания формы" т.е. перед
Delphi
1
Application.CreateForm(TForm1, Form1);
и будет тебе счастье.
0
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
03.04.2012, 12:26
Ты мне дал ссылку на код:
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
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
03.04.2012, 12:30
проблема в том что ты не умеешь думать, ты ждешь что бы тебе код готовый написали, что бы ты тупо Ctrl+C -> Ctrl+V, вот и весь программист.
Цитата Сообщение от ilya-vlas Посмотреть сообщение
нету времени на форумах сидеть
ну так вали отсюда.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.04.2012, 12:34
Я когда-то тоже искал ответ на такой же вопрос. Тоже нашел через хендл и т.п. Буд-то бы работало, когда тестировал. А пользователи на кнопке щелкали 2 раза и запускалось 2 копии, из которых одна глючила. В общем нашел вариант, который гарантировано работает. Если нужно - напишите и вечером выложу.
Смысл такой: еще в *dpr создаётся файл в памяти и там же после завершения удаляется. Перед созданием проверяется есть ли такой файл и если есть - выход.
0
 Аватар для Andretti
252 / 138 / 45
Регистрация: 19.03.2012
Сообщений: 314
Записей в блоге: 2
03.04.2012, 12:50
Лучший ответ Сообщение было отмечено как решение

Решение

Первый вариант :
Delphi
1
2
3
4
5
6
7
8
9
10
11
В блоке begin..end модуля .dpr: 
 
 
 
begin
  if HPrevInst <>0 then
  begin
    ActivatePreviousInstance;
    Halt;
  end;
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
41
42
43
44
45
46
47
48
unit PrevInst;
 
interface
 
uses
  WinProcs,
  WinTypes,
  SysUtils;
 
type
  PHWnd = ^HWnd;
 
function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;
 
procedure ActivatePreviousInstance;
 
implementation
 
function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;
var
  ClassName: array[0..30] of char;
begin
  Result := true;
  if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then
  begin
    GetClassName(Wnd, ClassName, 30);
    if STRIComp(ClassName, 'TApplication') = 0 then
    begin
      TargetWindow^ := Wnd;
      Result := false;
    end;
  end;
end;
 
procedure ActivatePreviousInstance;
var
  PrevInstWnd: HWnd;
begin
  PrevInstWnd := 0;
  EnumWindows(@EnumApps, LongInt(@PrevInstWnd));
  if PrevInstWnd <> 0 then
    if IsIconic(PrevInstWnd) then
      ShowWindow(PrevInstWnd, SW_Restore)
    else
      BringWindowToTop(PrevInstWnd);
end;
 
end.
Добавлено через 2 минуты
Второй вариант :

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
41
42
43
44
45
46
47
48
49
50
program Previns;
uses
  WinTypes,
  WinProcs,
  SysUtils,
  Forms,
  Uprevins in 'UPREVINS.PAS' {Form1};
{$R *.RES}
 
type
  PHWND = ^HWND;
 
function EnumFunc(Wnd: HWND; TargetWindow: PHWND): bool; export;
var
  ClassName: array[0..30] of char;
begin
  Result := true;
  if GetWindowWord(Wnd, GWW_HINSTANCE) = hPrevInst then
  begin
    GetClassName(Wnd, ClassName, 30);
    if StrIComp(ClassName, 'TApplication') = 0 then
    begin
      TargetWindow^ := Wnd;
      Result := false;
    end;
  end;
end;
 
procedure GotoPreviousInstance;
var
  PrevInstWnd: HWND;
begin
  PrevInstWnd := 0;
  EnumWindows(@EnumFunc, Longint(@PrevInstWnd));
  if PrevInstWnd <> 0 then
    if IsIconic(PrevInstWnd) then
      ShowWindow(PrevInstWnd, SW_RESTORE)
    else
      BringWindowToTop(PrevInstWnd);
end;
 
begin
  if hPrevInst <> 0 then
    GotoPreviousInstance
  else
  begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.
Добавлено через 1 минуту
Третий вариант:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
uses syncobjs;
...
var
  CheckEvent: TEvent;
 
...
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  CheckEvent := TEvent.Create(nil, false, true, 'MYPROGRAM_CHECKEXIST');
  if CheckEvent.WaitFor(10) <> wrSignaled then
  begin
    // Сюда попадаем если одна копия уже запущена.
    // Можно, например, сообщить об этом пользователю.
    Self.Close; // Здесь можно завершить программу или сделать еще что-нибудь.
  end;
end;
Добавлено через 8 минут
Четрвертый вариант :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program Project1;
 
uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.RES}
 
var
  hwnd: THandle;
 
begin
  hwnd := FindWindow('TForm1', 'Form1');
  if hwnd = 0 then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end
  else
    SetForegroundWindow(hwnd)
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
program pds;
 
uses
  Windows,
  Forms,
  Main in 'MAIN.PAS' {MainForm},
 
const
  MemFileSize = 127;
  MemFileName = 'one_example';
 
var
  MemHnd: HWND;
 
{$R *.RES}
 
begin
 
  MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil,
    PAGE_READWRITE, 0, MemFileSize,
    MemFileName);
  if GetLastError <> ERROR_ALREADY_EXISTS then
  begin
    Application.Initialize;
    with TForm1.Create(nil) do
    try
      Show;
      Update;
      Application.CreateForm(TMainForm, MainForm);
    finally
      Free;
    end;
    Application.Run;
  end
  else
    Application.MessageBox('Приложение уже запущено (возможно оно свернуто
      на панели задач): Нажмите кнопку ОК для продолжения работы',
      'Производственно-диспетчерская служба', MB_OK);
  CloseHandle(MemHnd);
end.
Шестой вариант:
Delphi
1
ActivatePrevInstance('TForm1','Значение Caption ');
Седьмой вариант :
В модуле program в части Uses нужно добавить previnst и вы получаете переменную ммм: boolean которая true если копия программы уже запущена.
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
program Project1;
 
uses
  previnst, windows, Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.RES}
begin
  if mmm then
  begin
    ShowWindow(FindWindow('tform1', 'Имя окна которое активизировать'),
      SW_restore);
 
    SetForegroundWindow(FindWindow('tform1', 'Имя окна которое
      активизировать'));
 
      halt; //завершить программу не создавая ничего.
  end;
 
  //Тело программы прогры
 
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
содержание модуля previnst.pas

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
unit Previnst;
 
interface
 
uses Windows;
 
var
  mmm: boolean; //эта переменная если true то программа уже запущена
 
implementation
 
var
  hMutex: integer;
begin
  mmm := false;
  hMutex := CreateMutex(nil, TRUE, 'AbraShvabra'); // Создаем семафор
  if GetLastError <> 0 then
    mmm := true; // Ошибка семафор уже создан
  ReleaseMutex(hMutex);
end.
Восьмой вариант:

Предоставленное разработчиками Delphi 2 Пачекой (Pacheco) и Тайхайрой (Teixeira) и значительно переработанное.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
unit multinst;
{
 
Применение:
Необходимый код в исходном проекте
 
if InitInstance then
begin
Application.Initialize;
Application.CreateForm(TFrmSelProject, FrmSelProject);
Application.Run;
end;
Это все понятно (я надеюсь)
}
 
interface
 
uses Forms, Windows, Dialogs, SysUtils;
 
const
 
  MI_NO_ERROR = 0;
  MI_FAIL_SUBCLASS = 1;
  MI_FAIL_CREATE_MUTEX = 2;
 
  { Проверка правильности запуска приложения с помощью описанных ниже функций. }
  { Количество флагов ошибок MI_* может быть более одного. }
 
function GetMIError: Integer;
function InitInstance: Boolean;
 
implementation
 
const
 
  UniqueAppStr: PChar; {Различное для каждого приложения}
 
var
 
  MessageId: Integer;
  WProc: TFNWndProc = nil;
  MutHandle: THandle = 0;
  MIError: Integer = 0;
 
function GetMIError: Integer;
begin
 
  Result := MIError;
end;
 
function NewWndProc(Handle: HWND; Msg: Integer; wParam,
 
  lParam: Longint): Longint; stdcall;
begin
 
  { Если это - сообщение о регистрации... }
 
  if Msg = MessageID then
  begin
    { если основная форма минимизирована, восстанавливаем ее }
 
{ передаем фокус приложению }
    if IsIconic(Application.Handle) then
    begin
      Application.MainForm.WindowState := wsNormal;
      ShowWindow(Application.Mainform.Handle, sw_restore);
    end;
    SetForegroundWindow(Application.MainForm.Handle);
  end
    { В противном случае посылаем сообщение предыдущему окну }
  else
    Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;
 
procedure SubClassApplication;
begin
 
  { Обязательная процедура. Необходима, чтобы обработчик }
  { Application.OnMessage был доступен для использования. }
  WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Longint(@NewWndProc)));
  { Если происходит ошибка, устанавливаем подходящий флаг }
  if WProc = nil then
    MIError := MIError or MI_FAIL_SUBCLASS;
end;
 
procedure DoFirstInstance;
begin
 
  SubClassApplication;
  MutHandle := CreateMutex(nil, False, UniqueAppStr);
  if MutHandle = 0 then
    MIError := MIError or MI_FAIL_CREATE_MUTEX;
end;
 
procedure BroadcastFocusMessage;
{ Процедура вызывается, если уже имеется запущенная копия Вашей программы. }
var
 
  BSMRecipients: DWORD;
begin
  { Не показываем основную форму }
 
  Application.ShowMainForm := False;
  { Посылаем другому приложению сообщение и информируем о необходимости }
  { перевести фокус на себя }
  BSMRecipients := BSM_APPLICATIONS;
  BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
    @BSMRecipients, MessageID, 0, 0);
end;
 
function InitInstance: Boolean;
begin
 
  MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
  if MutHandle = 0 then
  begin
    { Объект Mutex еще не создан, означая, что еще не создано }
 
{ другое приложение. }
    ShowWindow(Application.Handle, SW_ShowNormal);
    Application.ShowMainForm := True;
    DoFirstInstance;
    result := True;
  end
  else
  begin
    BroadcastFocusMessage;
    result := False;
  end;
end;
 
initialization
  begin
 
    UniqueAppStr := Application.Exexname;
    MessageID := RegisterWindowMessage(UniqueAppStr);
    ShowWindow(Application.Handle, SW_Hide);
    Application.ShowMainForm := FALSE;
  end;
 
finalization
  begin
 
    if WProc <> nil then
      { Приводим приложение в исходное состояние }
 
      SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));
  end;
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
var
  MutexHandle: THandle;
var
  UniqueKey: string;
 
function IsNextInstance: BOOLEAN;
begin
 
  Result := FALSE;
 
  MutexHandle := 0;
  MutexHandle := CREATEMUTEX(nil, TRUE, UniqueKey);
  if MutexHandle <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      Result := TRUE;
      CLOSEHANDLE(MutexHandle);
      MutexHandle := 0;
    end;
  end;
end;
 
begin
 
  CmdShow := SW_HIDE;
  MessageId := RegisterWindowMessage(zAppName);
  Application.Initialize;
  if IsNextInstance then
    PostMessage(HWND_BROADCAST, MessageId, 0, 0)
  else
  begin
    Application.ShowMainForm := FALSE;
    Application.CreateForm(TMainForm, MainForm);
    MainForm.StartTimer.Enabled := TRUE;
    Application.Run;
  end;
  if MutexHandle <> 0 then
    CLOSEHANDLE(MutexHandle);
end.
В MainForm вам необходимо вставить обработчик внутреннего сообщения

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TMainForm.OnAppMessage(var M: TMSG; var Ret: BOOLEAN);
begin
  if M.Message = MessageId then
  begin
    Ret := TRUE;
    // Поместить окно наверх !!!!!!!!
  end;
end;
 
initialization
  ShowWindow(Application.Handle, SW_Hide);
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
unit MultInst;
 
interface
 
const
  MI_QUERYWINDOWHANDLE = 1;
  MI_RESPONDWINDOWHANDLE = 2;
 
  MI_ERROR_NONE = 0;
  MI_ERROR_FAILSUBCLASS = 1;
  MI_ERROR_CREATINGMUTEX = 2;
 
  // Call this function to determine if error occurred in startup.
  // Value will be one or more of the MI_ERROR_* error flags.
function GetMIError: Integer;
 
implementation
 
uses Forms, Windows, SysUtils;
 
const
  UniqueAppStr = 'DDG.I_am_the_Eggman!';
 
var
  MessageId: Integer;
  WProc: TFNWndProc;
  MutHandle: THandle;
  MIError: Integer;
 
function GetMIError: Integer;
begin
  Result := MIError;
end;
 
function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
  Longint; stdcall;
begin
  Result := 0;
  // If this is the registered message...
  if Msg = MessageID then
  begin
    case wParam of
      MI_QUERYWINDOWHANDLE:
        // A new instance is asking for main window handle in order
        // to focus the main window, so normalize app and send back
        // message with main window handle.
        begin
          if IsIconic(Application.Handle) then
          begin
            Application.MainForm.WindowState := wsNormal;
            Application.Restore;
          end;
          PostMessage(HWND(lParam), MessageID, MI_RESPONDWINDOWHANDLE,
            Application.MainForm.Handle);
        end;
      MI_RESPONDWINDOWHANDLE:
        // The running instance has returned its main window handle,
        // so we need to focus it and go away.
        begin
          SetForegroundWindow(HWND(lParam));
          Application.Terminate;
        end;
    end;
  end
    // Otherwise, pass message on to old window proc
  else
    Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;
 
procedure SubClassApplication;
begin
  // We subclass Application window procedure so that
  // Application.OnMessage remains available for user.
  WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Longint(@NewWndProc)));
  // Set appropriate error flag if error condition occurred
  if WProc = nil then
    MIError := MIError or MI_ERROR_FAILSUBCLASS;
end;
 
procedure DoFirstInstance;
// This is called only for the first instance of the application
begin
  // Create the mutex with the (hopefully) unique string
  MutHandle := CreateMutex(nil, False, UniqueAppStr);
  if MutHandle = 0 then
    MIError := MIError or MI_ERROR_CREATINGMUTEX;
end;
 
procedure BroadcastFocusMessage;
// This is called when there is already an instance running.
var
  BSMRecipients: DWORD;
begin
  // Prevent main form from flashing
  Application.ShowMainForm := False;
  // Post message to try to establish a dialogue with previous instance
  BSMRecipients := BSM_APPLICATIONS;
  BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
    @BSMRecipients, MessageID, MI_QUERYWINDOWHANDLE,
    Application.Handle);
end;
 
procedure InitInstance;
begin
  SubClassApplication; // hook application message loop
  MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
  if MutHandle = 0 then
    // Mutex object has not yet been created, meaning that no previous
    // instance has been created.
    DoFirstInstance
  else
    BroadcastFocusMessage;
end;
 
initialization
  MessageID := RegisterWindowMessage(UniqueAppStr);
  InitInstance;
finalization
  // Restore old application window procedure
  if WProc <> nil then
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));
  if MutHandle <> 0 then
    CloseHandle(MutHandle); // Free mutex
end.
unit OIMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TMainForm = class(TForm)
    Label1: TLabel;
    CloseBtn: TButton;
    procedure CloseBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  MainForm: TMainForm;
 
implementation
 
uses MultInst;
 
{$R *.DFM}
 
procedure TMainForm.CloseBtnClick(Sender: TObject);
begin
  Close;
end;
 
end.
7
Заблокирован
03.04.2012, 13:10
Цитата Сообщение от anonimus Посмотреть сообщение
ты ждешь что бы тебе код готовый написали, что бы ты тупо Ctrl+C -> Ctrl+V, вот и весь программист.
самое прикольное, что такие программисты-копипастеры потом с важным видом ставят свои копирайты везде где можно
0
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
03.04.2012, 13:51
Andretti Маньяк!=) 5 Баллов!
0
 Аватар для Andretti
252 / 138 / 45
Регистрация: 19.03.2012
Сообщений: 314
Записей в блоге: 2
03.04.2012, 15:07
paxan86, Просто нужно чутка в гугле посидеть и там все найдеться на различных сайтах ))
0
 Аватар для Tornament
71 / 71 / 2
Регистрация: 28.10.2010
Сообщений: 329
03.04.2012, 18:46
То что я написал
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program Project1;
 
uses
  windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
var HM: THandle;
{$R *.res}
 
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'CdpApp');
  if (HM <> 0) then
    begin
      exit;
    end
  else
    HM := CreateMutex(nil, false, 'CdpApp');
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
03.04.2012, 18:56
Я иногда делаю так:
Delphi
1
2
3
4
5
6
7
8
procedure CanStart;
var
  Mtx: THandle;
begin
  Mtx := CreateMutex(nil, False, 'application_duplicate');
  if WaitForSingleObject(Mtx, 0) <> WAIT_OBJECT_0 then
    Application.Terminate;
end;
Добавлено через 1 минуту
О, сорри, по ссылке выше есть похожий вариант
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,607
14.06.2012, 00:24
Цитата Сообщение от KaZaK555 Посмотреть сообщение
Здраствуйте я хотел бы узнать как сделать так чтобы запретить запуск 2 окна программы!
"Пример"
Я сделал программу, и могу запускать ее бесконечно раз во многих окнах. как запретить такую возможность и сделать так что запустить можно только 1 программу при запуске второй выдавалась бы ошибка)) Спасибо!
Для того чтобы не дать программе запуститься, если её копия уже работает выполните следующие дейтвия: выберите Project -> View Source. Появится окно редактора кода с открытым файлом Project.dpr (по умолчанию). Далее добавьте в список модулей модуль Windows. А между Begin и End напишите:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024, 
'Programm Name'); 
if GetLastError <> ERROR_ALREADY_EXISTS then 
begin 
Application.Initialize; 
Application.CreateForm(TForm1, Form1); 
Application.Run; 
end 
else 
begin 
Application.MessageBox('Программа уже запущена !', 'Внимание'); 
halt; 
end;
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,607
14.06.2012, 00:29
Цитата Сообщение от KaZaK555 Посмотреть сообщение
Здраствуйте я хотел бы узнать как сделать так чтобы запретить запуск 2 окна программы!
"Пример"
Я сделал программу, и могу запускать ее бесконечно раз во многих окнах. как запретить такую возможность и сделать так что запустить можно только 1 программу при запуске второй выдавалась бы ошибка)) Спасибо!
Смотрите
Миниатюры
Запрет запуска более 1 копии программы   Запрет запуска более 1 копии программы  
0
SW
 Аватар для SW
39 / 11 / 3
Регистрация: 08.09.2012
Сообщений: 215
25.10.2012, 22:19
xxbesoxx, у вас тут тоже ошибка в коде... не синтаксическая - логическая! С какого раза закрывается программа?
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,607
25.10.2012, 22:40
Цитата Сообщение от kta87 Посмотреть сообщение
xxbesoxx, у вас тут тоже ошибка в коде... не синтаксическая - логическая! С какого раза закрывается программа?
А где вы увидели ошибка скажите пожалуйста , Это код работает нормально и взял из Книге .... Ну вы может что то исправите я внимательно буду читать .... Жду ваши замечание, покажите где ошибка
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
25.10.2012, 22:45
Запуск приложения стоит дважды.
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,607
25.10.2012, 23:04
Цитата Сообщение от Одиночка Посмотреть сообщение
Запуск приложения стоит дважды.
Правильно . Одиночка Вы прав так будет правильно

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
program Project2;
 
uses
Windows,
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
begin
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024,
'Programm Name');
if GetLastError <> ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Application.MessageBox('Программа уже выполняется!', 'Внимание');
halt;
end;
end.
0
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
25.10.2012, 23:07
Такая куча-мала. Тоже свалюсь. Можно использовать атомы - дешево и сердито
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
 Var
....
 RunAtom   : Integer = 0;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
  RunAtom:=GlobalFindAtom('FiFiFi'); //Здесь какое-нибудь уникальное имя придумать
  If RunAtom<>0 then
    Begin
      MessageBeep(MB_ICONASTERISK);  //
      Sleep(600);
      Application.MessageBox('Программа FiFiFi уже выполняется!','FiFiFi',MB_OK);
      Halt;
    end;
  RunAtom:=GlobalAddAtom('FiFiFi');
...
end;
...
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
   If RunAtom<>0 then GlobalDeleteAtom(RunAtom);
...
end;
end.
1
8 / 8 / 0
Регистрация: 24.05.2012
Сообщений: 31
25.10.2012, 23:11
Цитата Сообщение от KaZaK555 Посмотреть сообщение
Здраствуйте я хотел бы узнать как сделать так чтобы запретить запуск 2 окна программы!
"Пример"
Я сделал программу, и могу запускать ее бесконечно раз во многих окнах. как запретить такую возможность и сделать так что запустить можно только 1 программу при запуске второй выдавалась бы ошибка)) Спасибо!
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
program Project2;
 
uses
Windows,
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
const
  MUTEX = 'dfdsfdsf_Mutex_bv387w';
 var
  hMutex: THandle;
begin
 
 
  hMutex := OpenMutex(MUTEX_ALL_ACCESS, False, MUTEX);
  if hMutex <> 0 then
  begin
    MessageBox(0,'Error!','Error!',0);
    Exit;
  end;
  hMutex := CreateMutex(nil, False, MUTEX);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  if hMutex <> 0 then
  begin
    ReleaseMutex(hMutex);
    CloseHandle(hMutex);
  end;
 
end.
0
SW
 Аватар для SW
39 / 11 / 3
Регистрация: 08.09.2012
Сообщений: 215
25.10.2012, 23:59
xxbesoxx, ну вам уже подсказали! А вообще улыбнул меня предложенный вами метод, конечно убрав 2 запуска!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2012, 23:59

Как запретить два запуска копии программы
Как запретить два запуска копии программы почему это элементарно не работает &gt;&gt;&gt;&gt;&gt; program Project1; uses ...

Запрет запуска более одной копии файла
Здравствуйте, нужно сделать так, чтобы BAT файл проверял был ли он запущен ранее или нет и завершал все копии, кроме текущей. Надеюсь на...

MFC. Запрет запуска второй копии программы
Здравстуйте. В главе 3 книги Дж. Рихтера есть простая реализация примера для запрета запуска второй копии программы. Пытаюсь ее...

Запрет запуска копии процесса
HWND hWnd; hWnd=::FindWindow(name,NULL); if (hWnd) { if (IsIconic(hWnd)) ShowWindow(hWnd,SW_RESTORE); ...

Запрет запуска копии приложения
Как запретить запуск копии приложения? Конечно, есть идеи по созданию левого файла, который отследить запуск копии и закроет ещё, но как...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru