Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск программы(только 1 копия) [D7, XP]


Страницы:   1 2 3

kyn66 ©   (2009-11-11 13:19:00) 

Добрый день. Решил применить вот этот способ для отслеживания запущенной программы при попытке повторного запуска. Дописываю в файл проекта.

...
Const AppID='ProgaOnlyOne';

Var
 Handle:THandle;

begin
 Handle:=CreateFileMapping($FFFFFFFF,Nil,PAGE_READONLY,0,1,AppID);
 If GetLastError=ERROR_ALREADY_EXISTS then
  MessageBox(0,'Запуск второй копии программы недопустим.',
             AppID,MB_OK or MB_ICONSTOP or MB_TOPMOST)
 else
  begin
    Application.Initialize;
    Application.CreateForm(TDM1, DM1);
    Application.CreateForm(TMainFrm, MainFrm);
    Application.Run;
  end;
 // Освобождаем ресурс и тем самым разрешаем следующий запуск.
 CloseHandle(Handle);
end.


Все работает по определению нормально. Что скажут мастера по эффективности такого метода? Есть ли для него какие подводные камни? И если прога спрятана в трее (иконка), то как ее при обнаружении поднять оттуда, как это делают многи программы?


Anatoly Podgoretsky   (2009-11-11 21:21:00) [21]

> Leonid Troyanovsky  (11.11.2009 20:25:36)  [36]

Рассмешили и все равно не понятно.


Leonid Troyanovsky   (2009-11-11 20:25:00) [22]


> kyn66 ©   (11.11.09 19:25) [33]

> а к чему она? Не понятно.

До истины докопаться, чтобы понятно было.

--
Regards, LVT.


kyn66   (2009-11-11 20:22:00) [23]


> читал не внимательно, читай еще.


Что читать, за основу взят поиску по заглавию окна. А если в процессе работы заглавие меняется?


antonn   (2009-11-11 20:00:00) [24]


> Интересно конечно, но много писанины ради примитивного FindWindow.
>  Не подходит.....

читал не внимательно, читай еще.


kyn66   (2009-11-11 19:25:00) [25]


> Это почему ж?


а к чему она? Не понятно.


Leonid Troyanovsky   (2009-11-11 19:20:00) [26]


> kyn66 ©   (11.11.09 19:03) [31]

> > Хотели, как лучше, получилось - как всегда.

> Ирония не уместна, как раз таки вариант [22] то что нужно!

Это почему ж?

--
Regards, LVT.


kyn66   (2009-11-11 19:03:00) [27]


> Leonid Troyanovsky ©   (11.11.09 18:12) [30]


Пока шел с работы - понял. Что даже при повторном запуске МЫ программу запускаем заново и этим управляет файл проекта. Поэтому для этого запуска форма главная еще не создана, отсюда и ошибка. Этот механизм[0]) хорош только для предварительно сообщения о запуске второй версии и все. Следовательно [1] здесь уже не прокатит.


> Хотели, как лучше, получилось - как всегда.


Ирония не уместна, как раз таки вариант [22] то что нужно!


> Иди букварь читать, двоечник.

Да не такой уж я и двоешник, просто люблю до истины докапаться, чтобы понятно было.


Leonid Troyanovsky   (2009-11-11 18:12:00) [28]


> kyn66 ©   (11.11.09 17:50) [27]

Иди букварь читать, двоечник.

--
Regards, LVT.


Leonid Troyanovsky   (2009-11-11 18:08:00) [29]


> kyn66 ©   (11.11.09 16:30) [22]

> отца русской демократии :)   http://gurin.tomsknet.ru/delphisingletonrun.
> html

Хотели, как лучше, получилось - как всегда.

--
Regards, LVT.


Дмитрий Белькевич   (2009-11-11 18:01:00) [30]


> Понятно то, что ошибка возникает в момент обращения к MainFrm.
> TrayIcon1. впринципе. А вот почему - не понятно.


Потому что MainFrm нужно вызывать в первой, полностью запущенной программе. А не во второй.


> Я по иконке поле сообщения кликаю и она свободно поднимается
> без всяких там Application.CreateForm(TMainFrm, MainFrm);
>  


Я тебя разочарую. Когда ты кликаешь по иконке, то CreateForm(TMainFrm, MainFrm) уже давно произошел, иначе бы кликать не по чем еще было.


kyn66   (2009-11-11 17:50:00) [31]


> If GetLastError=ERROR_ALREADY_EXISTS then


При повторном вхождении мы во второй блок ваще не попадаем, подразумевается что прога уже загружена. Просто выдаем сообщение и все на этом. Прога лежит в трэе. Я по иконке поле сообщения кликаю и она свободно поднимается без всяких там Application.CreateForm(TMainFrm, MainFrm); . По первому разу - да.


Leonid Troyanovsky   (2009-11-11 17:46:00) [32]


> kyn66 ©   (11.11.09 16:30) [22]

> Почему не создана? Она же в трэе уже лежит.

От мертвого осла уши там лежат.

См. где вызывается MainForm:

>  If GetLastError=ERROR_ALREADY_EXISTS then
>   begin
>     MessageBox(0,'Попытка повторного запуска программы.',
>
>                'ВНИМАНИЕ !',MB_OK or MB_ICONSTOP or MB_TOPMOST);
>
>     MainFrm.TrayIcon1.ShowMainForm;

И где:

>     Application.CreateForm(TMainFrm, MainFrm);

--
Regards, LVT.


Dennis I. Komarov   (2009-11-11 16:52:00) [33]


> житель города Эстония

мда...


kyn66   (2009-11-11 16:39:00) [34]


> Anatoly Podgoretsky ©   (11.11.09 16:36) [23]
> > kyn66  (11.11.2009 15:21:13)  [13]


К вашему глубокому разочарованию, уважаемый житель города Эстония, вирусов у меня в системе нет, а проблема решена [22]


Anatoly Podgoretsky   (2009-11-11 16:36:00) [35]

> kyn66  (11.11.2009 15:21:13)  [13]

Тогда у тебя два вируса.


kyn66   (2009-11-11 16:30:00) [36]


> Чего ж непонятного? Форма-то еще не создана.


Почему не создана? Она же в трэе уже лежит. Вот что спасло отца русской демократии :)   http://gurin.tomsknet.ru/delphisingletonrun.html


Leonid Troyanovsky   (2009-11-11 16:18:00) [37]


> kyn66 ©   (11.11.09 16:10) [20]

> TrayIcon1. впринципе. А вот почему - не понятно.

Чего ж непонятного? Форма-то еще не создана.

--
Regards, LVT.


kyn66   (2009-11-11 16:10:00) [38]

Понятно то, что ошибка возникает в момент обращения к MainFrm.TrayIcon1.впринципе. А вот почему - не понятно. Из главной формы вызов MainFrm.TrayIcon1.ShowMainForm;работает на ура, без всяких ошибок. Почему же вызов этого метода из файла проекта вызывает исключение AV ???


kyn66   (2009-11-11 15:54:00) [39]


> antonn ©   (11.11.09 13:34) [3]
> я предпочитаю создавать мьютекс (если не нужно взаимодействие
> с уже запущенным приложением), а вообще - http://forum.sources.
> ru/index.php?showtopic=150620


Интересно конечно, но много писанины ради примитивного FindWindow. Не подходит..... Проще всего, не мудря, можно было метку записвывать в реестре при старте программы и удалять ее после завершения. Однако грабельки могут возникнуть тогда, если программа завершилась не корректно, зависла, процесс удален.


kyn66   (2009-11-11 15:49:00) [40]


> Anatoly Podgoretsky ©   (11.11.09 15:39) [17]


Читайте внимательно [10]


> RWolf ©   (11.11.09 15:24) [14]
> > kyn66проверьте все *.dcu, *.exe на вхождение строки «$bak$».
>  Найденные — сотрите.


Все проверено - мин нет. Да я уверен, это единичный случай. Лежал себе не троганый, как коснулось дело его, то аваст и воспрял...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо