![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск программы(только 1 копия) [D7, XP]
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$».
> Найденные — сотрите.
Все проверено - мин нет. Да я уверен, это единичный случай. Лежал себе не троганый, как коснулось дело его, то аваст и воспрял...