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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2011, 00:38   #1
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию Запретить второй запуск программы. Приложение без окон

Сабж. Без подключения в uses компонента формы.
Все примеры что находил в инете юзали окна
Lauri вне форума Ответить с цитированием
Старый 05.07.2011, 00:56   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
var
  f_m: THandle;	// mutex
begin
  f_m := CreateMutex(nil, true, srMutexName);
  if ( (ERROR_ALREADY_EXISTS = GetLastError()) or (ERROR_ACCESS_DENIED  = GetLastError()) ) then begin
    //
    if (0 <> f_m) then CloseHandle(f_m);
    MessageBox('Another instance is already running');
  end
  else try
    // запустились
  finally
    CloseHandle(f_m);
  end;
end.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 01:27   #3
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Код:
begin
     f_m := CreateMutex(nil, true, 'sysproc12');
  if ( (ERROR_ALREADY_EXISTS = GetLastError()) or (ERROR_ACCESS_DENIED  = GetLastError()) ) then begin
    //
    if (0 <> f_m) then CloseHandle(f_m);

  end
  else try
//тело программы
 finally
    CloseHandle(f_m);
  end;
Программа просто вылетает

Последний раз редактировалось Lauri; 05.07.2011 в 01:31.
Lauri вне форума Ответить с цитированием
Старый 05.07.2011, 01:37   #4
Epiffan
 
Аватар для Epiffan
 
Регистрация: 04.07.2011
Сообщений: 2
По умолчанию

Попробуй вот так, правда я использую его для оконных программ
Код:
uses  Windows;

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

begin
  if Check then Exit;
end.
Epiffan вне форума Ответить с цитированием
Старый 05.07.2011, 01:47   #5
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Epiffan Посмотреть сообщение
Попробуй вот так, правда я использую его для оконных программ
Код:
uses  Windows;

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

begin
  if Check then Exit;
end.
странно... тупо вылетает
Lauri вне форума Ответить с цитированием
Старый 05.07.2011, 12:39   #6
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

А ты куда этот код вставляешь?
Его нужно в ресурсы проекта вставлять program Project1;

Примерно так
Код:
program Project1;

uses
  windows;

{$R *.res}

 var
  HM: THandle;
AMsg: TMsg;

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

begin
  if Check then Exit;

//А дальше наверное это если без окон работаете
while (GetMessage(AMsg, 0, 0, 0)) do
    begin
      //Запускаем цикл обработки сообщений
      TranslateMessage(AMsg);
      DispatchMessage(AMsg);
    end;
    Halt(AMsg.wParam);

//Или же это если с формами работаете
 Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Последний раз редактировалось Aliens_wolfs; 05.07.2011 в 12:50.
Aliens_wolfs вне форума Ответить с цитированием
Старый 05.07.2011, 12:43   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Программа просто вылетает
> странно... тупо вылетает

ну так может проблема в программе, а не в нашем коде )
Вот полный проект, ничего никуда не вылетает. В течении 3-х секунд после запуска одной копии остальные копии тихо выходят:

Код:
{$APPTYPE CONSOLE }

uses
  Windows;

var
  f_m: THandle;
begin
  f_m := CreateMutex(nil, true, 'sysproc12');
  if ( (ERROR_ALREADY_EXISTS = GetLastError()) or (ERROR_ACCESS_DENIED  = GetLastError()) ) then begin
    //
    if (0 <> f_m) then CloseHandle(f_m);

  end
  else try
    //
    WriteLn('Hi there!');
    Sleep(3000);
  finally
    CloseHandle(f_m);
  end;
end.
Да, и в коде от Epiffan и Aliens_wolfs есть ненулевая вероятность, что запустится 2 или больше копий.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 13:02   #8
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Понял в чём проблема.
У меня нету строки {$APPTYPE CONSOLE } так как программа работает в тихом режиме. Из-за этого и вылетает сразу.

Только как в таком случаи поступить?

Последний раз редактировалось Lauri; 05.07.2011 в 13:20.
Lauri вне форума Ответить с цитированием
Старый 05.07.2011, 13:30   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Каком ещё тихом режиме? ) Без главного окна? И консоль вам не нужна?
Ну так не вызывайте WriteLn() и прочие команды, ожидающие консольный ввод-вывод, и не будет ничего вылетать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 13:38   #10
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Каком ещё тихом режиме? ) Без главного окна? И консоль вам не нужна?
Ну так не вызывайте WriteLn() и прочие команды, ожидающие консольный ввод-вывод, и не будет ничего вылетать.
Дык вот именно что не вызываю, и без приведённого кода выше всё работает, а с кодом - вылетает.
Lauri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так чтобы приложение базы данных работала на компьютерах без установленной программы delphi? Даниил_глазко БД в Delphi 6 09.11.2010 16:26
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47
Запуск программы без дельфи grom333 Общие вопросы Delphi 11 20.02.2009 23:59