Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключение повторного запуска проги 
:(
    Опции темы
TP@MB@Y
Дата 25.6.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



У многих прог такая вещь реализована, т.е. нельзя запустить программу несколько раз если она уже запущена. Хочу у своих прог тоже так делать.

Вот что я пытаюсь изобразить:
Код

procedure TfMain.FormCreate(Sender: TObject);
begin
 if findwindow(nil,'Project1.exe')<>0 then close
end;


Но прога всеравно запускается повторно.
PM   Вверх
_hunter
Дата 25.6.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а ты уверен что окно именно так называется? запусти WinSight и посмотри


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Poseidon
Дата 25.6.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Код
program Project1;

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

{$R *.res}

function Check: boolean;
var
  HM: THandle;
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(TForm1, Form1);
  Application.Run;
end.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Quadr0
Дата 25.6.2005, 18:51 (ссылка)    |    (голосов: 2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 22:22
  Вверх
Quadr0
Дата 25.6.2005, 19:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 22:22
  Вверх
Albinos_x
Дата 25.6.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



я пользуюсь таким вариантом:

Код

var
  Form1: TForm1;
  CheckEvent:TEvent;
 

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
CheckEvent:=TEvent.Create(nil,false,true,'MYPROGRAM_CHECKEXIST');
IF CheckEvent.WaitFor(10)<>wrSignaled then
   begin
   Application.Terminate;
   end;
end;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
jack128_
Дата 26.6.2005, 11:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Quadr0
Цитата(Quadr0 @ 25.6.2005, 18:51)
begin
  if hPrevInst then
  begin
    ShowMessage('Program is already running!');
    Halt;
  end

Застрял в Win16? ;)
Подъитоживая все предложенные методы: создаешь именнованный объект ядра. Если в процессе создания выледзла ошибка ERROR_ALREADY_EXISTS (объект с заданным именем уже существует) то завершаешь программу. Имя объекта должно быть уникальным, так чтот лудше использовать для именнования guid'ы
  Вверх
TP@MB@Y
Дата 26.6.2005, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Всем спасибо. Принцип понятен smile
PM   Вверх
h2o
Дата 2.9.2005, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



Нужно зделать Семафор! Простая структура+делает всё что тебе нужно!
Добавлено @ 15:37
в FormCreate пропиши
Код

CreateSemaphore(nil,0,1,'1C db PackIT!Mon');
        {Cоздаём семафор и проверяем, не возникла ли при этом ошибка.
         Если возникла - значит, такой семафор уже существует, то есть уже есть
         запущенный экземпляр программы.}
     if GetLastError=Error_Already_Exists then
      begin
       MessageDlg('Приложение уже запущено!',mterror, [mbok], 0);
       Application.Terminate;
      end;

Добавлено @ 15:39
'1C db PackIT!Mon' - это любое слово, например название твоей проги. если у тебя несколько прог, вписывай разные слова, а то одна не даст другую запустить!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
offline
Дата 2.9.2005, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: нет
Всего: 7



Я делаю как сказал Poseidon но еще добавляю сообщение, что программа уже запущена, работает 100%, но есть одна фигня, это то, что управление не передается уже запущенной программе smile Было бы хорошо, показать сообщение, а потом перейти к запущенному экземпляру программы.
PM MAIL   Вверх
_hunter
Дата 2.9.2005, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



для этого можеш посылать ей какое-нить сообщение ( WM_USER + N ) можеш event назначить...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
dvamaster
Дата 2.9.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



Есть еще Atom, можно при запуске поги проверять его наличие, затем, если не найден, создавать его, а при выходе убивать!

smile


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 5.9.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Атом можно использовать , только одна трабла, при зависании процесса и последующем его гроханье через таскманагер, процесс более запустить не удастся smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dvamaster
Дата 6.9.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



Romikgy, ты прав, чего-то я про это не подумал


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Angel_19
Дата 22.9.2005, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 5.4.2005

Репутация: нет
Всего: нет



В наборе RX есть для этого функция. Работает отлично ...
PM ICQ   Вверх
EvilsInterrupt
Дата 27.8.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Сегодня столкнулся с тем, что нужно было не просто исключить повторный запуск, а весьма хитро исключить )

Разрабатываю репликатор, он цепляется к промышленному COM-серверу, и ложит в базу данных. Этот репликатор разрешено для запуска в двух экземплярах, но ! , в разных папках. К примеру один репликатор для турбогенератора, а другой для котлоагрегата ! ;)

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

Вобщем выставил требования таковыми:

1. Возможность запуска двух экземпляров репликатора, но с разных папок.
2. Из одной папки репликатор можно запустить только и только в одном экземпляре
3. Репликатор не должен зависеть от последствий аварийного выключения через диспетчер задач.


При данных требованиях, остановился на следующем коде, может кому и поможет:

Код

  function  IsApplicationRun : Boolean;
  var
    hMutex        : THandle;
  begin
    Result  := False;
    hMutex := CreateMutex(nil, True,
              PChar(AnsiReplaceText(Application.ExeName,'\','/')));
    if  GetLastError = ERROR_ALREADY_EXISTS then
        Result := True;
  end;


hMutex - несмотря на то что это локальная переменная и казалось мы же теряем значение хэндла. Ну и что я спрошу ))) В конечном итоге, хоть через диспетчер задач, хоть через Application.Terminate хэндлы то убиваются - значит убивается и мьютекс ;)

Думаю, это решит проблемы новичков
PM MAIL WWW ICQ Jabber   Вверх
07pov23
Дата 20.1.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Столкнулся с такой проблемой. Вроде бы программа не запускается дважды. Но! В терминальном режиме ни одна фича приведенная здесь не запускается. Подскажите, пожалуйста, как можно запретить запуск нескольких копий программы в терминальном режиме разными пользователе.
ЗЫ. Еще вопрос хоть не совсем в тему, но все же. Как запускать программу в качестве службы или под системой, т.е. еще до аутентификации пользователя
PM MAIL   Вверх
dumb
Дата 20.1.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(07pov23 @  20.1.2009,  17:01 Найти цитируемый пост)
как можно запретить запуск нескольких копий программы в терминальном режиме разными пользователе.

07pov23, берешь любой код с CreateMutex/Event/FileMapping и в имени объекта делаешь префикс 'Global\', т.е. вместо 'MyOwnMutex'(см. 3ий пост) становится 'Global\MyOwnMutex'. единственное, что надо бы проверку версии винды делать, ибо до w2k(вроде) такой префикс недопустим.

Цитата(07pov23 @  20.1.2009,  17:01 Найти цитируемый пост)
ЗЫ. Еще вопрос хоть не совсем в тему, но все же. Как запускать программу в качестве службы или под системой, т.е. еще до аутентификации пользователя 
правила форума прочти. а так, как вариант - http://support.microsoft.com/kb/137890
PM MAIL   Вверх
07pov23
Дата 21.1.2009, 10:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Вся проблема в том, что как раз win2k и есть.
PM MAIL   Вверх
bems
Дата 22.1.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(dumb @  20.1.2009,  19:21 Найти цитируемый пост)
что надо бы проверку версии винды делать, ибо до w2k(вроде) такой префикс недопустим.

а в Висте в глобал очень мало кого пускают


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bartram
Дата 24.1.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



Цитата(07pov23 @  20.1.2009,  19:01 Найти цитируемый пост)
ЗЫ. Еще вопрос хоть не совсем в тему, но все же. Как запускать программу в качестве службы или под системой, т.е. еще до аутентификации пользователя 

Модератор: Пожалуйста, один топик - один вопрос.

 Правила форума: http://forum.vingrad.ru/index.php?act=boardrules


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1041 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.