Форум: "Начинающим";
Текущий архив: 2010.01.03;
Скачать: [xml.tar.bz2];
ВнизЗапуск программы(только 1 копия) Найти похожие ветки
← →
kyn66 © (2009-11-11 13:19) [0]Добрый день. Решил применить вот этот способ для отслеживания запущенной программы при попытке повторного запуска. Дописываю в файл проекта.
...
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.
Все работает по определению нормально. Что скажут мастера по эффективности такого метода? Есть ли для него какие подводные камни? И если прога спрятана в трее (иконка), то как ее при обнаружении поднять оттуда, как это делают многи программы?
← →
Kolan © (2009-11-11 13:25) [1]Как «спрятали» в трей, так и доставайте обратно.
← →
Дмитрий Белькевич (2009-11-11 13:34) [2]Как прячешь в трей? Я свои, например, прячу компонентой cooltrayicon. Она же и вытаскивать из трея умеет. А ты как вытаскиваешь? Ну так вот - этот же код вызывай из другой копии программы в первой. Как-то первой копии сообщив, что пытается запуститься вторая.
← →
antonn © (2009-11-11 13:34) [3]я предпочитаю создавать мьютекс (если не нужно взаимодействие с уже запущенным приложением), а вообще - http://forum.sources.ru/index.php?showtopic=150620
← →
sniknik © (2009-11-11 13:34) [4]для гарантированного освобождения ресурсов используют try finally, и обычно (или просто чаще видел) для этих целей используют мютексы.
← →
kyn66 © (2009-11-11 13:40) [5]Использую TCoolTrayIcon. Добавил строку
...
If GetLastError=ERROR_ALREADY_EXISTS then
begin
MessageBox(0,"Попытка повторного запуска программы.",
"ВНИМАНИЕ !",MB_OK or MB_ICONSTOP or MB_TOPMOST);
MainFrm.TrayIcon1.ShowMainForm;
end
...
Результат ошеломил! После первого запуска Аваст заорал, что моя прога заражена вирусом Induc. При компиляции все нормально. ЗАпускаю второй раз - обломс. "Приложение будеи закрыто. Приносим свои извенения."...
Вот это чудо... Грабли?
← →
RWolf © (2009-11-11 13:44) [6]Нет, это действительно вирус. Лечите.
← →
Kolan © (2009-11-11 14:18) [7]Еще для определения запущенной копии можно использовать мьютекс.
← →
Anatoly Podgoretsky © (2009-11-11 14:35) [8]> kyn66 (11.11.2009 13:40:05) [5]
И ты собираешься это распространять.
← →
GanibalLector © (2009-11-11 14:48) [9]Можно и семафор
begin
hSemaphore:=CreateSemaphore(nil,0,1,pChar("74AC8BEC-132C-401C-AC18-D0FF6B508EA2"));
try
if GetLastError = ERROR_ALREADY_EXISTS then
begin
// мессага о том, что уже запущен
Exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
ReleaseSemaphore(hSemaphore,1,nil);
CloseHandle(hSemaphore);
end;
Но, при запуске программы под другим пользователем(например, если вошли через удаленный рабочий стол) она запустится. Кстати, кто-нибудь знает, как от этого избавиться?
← →
kyn66 © (2009-11-11 14:54) [10]После перзагрузки ситуация повторилась(Аваст видит вирус). Но видит он его где? В параллельной папке лежал ехе-шник, для других целей, с точно таким именем, ка основная прога. Так вот почему-то аваст находил в нем вирус, хотя при запуске он никакого отношения не имел. В нем мог и быть вирус, давно лежит. После первого упоминания о индуке проверял весь комп. НУ это ладно, тот файл удалил. Почему он цеплялся при поиске snjhjq копии в памяти? Сейчас выдает Access Violation/Gjghj,e. искать в каком месте. Но код то по идее верный с вызовом через MainFrm.TrayIcon1.ShowMainForm; ?
← →
kyn66 © (2009-11-11 15:05) [11]
> Anatoly Podgoretsky © (11.11.09 14:35) [8]
> > kyn66 (11.11.2009 13:40:05) [5]И ты собираешься это
> распространять.
Да собираюсь, после устранения ошибки. А что смущает в [5]?
← →
antonn © (2009-11-11 15:14) [12]
> kyn66 © (11.11.09 14:54) [10]
>
> После перзагрузки ситуация повторилась(Аваст видит вирус).
> Но видит он его где?
http://forum.sources.ru/index.php?showtopic=279176
← →
kyn66 © (2009-11-11 15:21) [13]
> http://forum.sources.ru/index.php?showtopic=279176
не открывается ссылка.
← →
RWolf © (2009-11-11 15:24) [14]
> kyn66
проверьте все *.dcu, *.exe на вхождение строки «$bak$». Найденные — сотрите.
← →
RWolf © (2009-11-11 15:26) [15]Для профилактики дальнейшего распространения индюка — создайте C:\Program Files\Borland\Delphi7\Lib\sysconst.bak с любым содержимым. Также не мешает закрыть от записи каталоги Lib и Source.
← →
Leonid Troyanovsky © (2009-11-11 15:28) [16]
> GanibalLector © (11.11.09 14:48) [9]
> Но, при запуске программы под другим пользователем(например,
> если вошли через удаленный рабочий стол) она запустится.
> Кстати, кто-нибудь знает, как от этого избавиться?
http://msdn.microsoft.com/en-us/library/aa382954(VS.85).aspx
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2009-11-11 15:39) [17]> kyn66 (11.11.2009 15:05:11) [11]
Меня смущает распространение вируса, особо, что тебе это известно.
← →
kyn66 © (2009-11-11 15:49) [18]
> Anatoly Podgoretsky © (11.11.09 15:39) [17]
Читайте внимательно [10]
> RWolf © (11.11.09 15:24) [14]
> > kyn66проверьте все *.dcu, *.exe на вхождение строки «$bak$».
> Найденные — сотрите.
Все проверено - мин нет. Да я уверен, это единичный случай. Лежал себе не троганый, как коснулось дело его, то аваст и воспрял...
← →
kyn66 © (2009-11-11 15:54) [19]
> antonn © (11.11.09 13:34) [3]
> я предпочитаю создавать мьютекс (если не нужно взаимодействие
> с уже запущенным приложением), а вообще - http://forum.sources.
> ru/index.php?showtopic=150620
Интересно конечно, но много писанины ради примитивного FindWindow. Не подходит..... Проще всего, не мудря, можно было метку записвывать в реестре при старте программы и удалять ее после завершения. Однако грабельки могут возникнуть тогда, если программа завершилась не корректно, зависла, процесс удален.
← →
kyn66 © (2009-11-11 16:10) [20]Понятно то, что ошибка возникает в момент обращения к MainFrm.TrayIcon1. впринципе. А вот почему - не понятно. Из главной формы вызов MainFrm.TrayIcon1.ShowMainForm; работает на ура, без всяких ошибок. Почему же вызов этого метода из файла проекта вызывает исключение AV ???
← →
Leonid Troyanovsky © (2009-11-11 16:18) [21]
> kyn66 © (11.11.09 16:10) [20]
> TrayIcon1. впринципе. А вот почему - не понятно.
Чего ж непонятного? Форма-то еще не создана.
--
Regards, LVT.
← →
kyn66 © (2009-11-11 16:30) [22]
> Чего ж непонятного? Форма-то еще не создана.
Почему не создана? Она же в трэе уже лежит. Вот что спасло отца русской демократии :) http://gurin.tomsknet.ru/delphisingletonrun.html
← →
Anatoly Podgoretsky © (2009-11-11 16:36) [23]> kyn66 (11.11.2009 15:21:13) [13]
Тогда у тебя два вируса.
← →
kyn66 © (2009-11-11 16:39) [24]
> Anatoly Podgoretsky © (11.11.09 16:36) [23]
> > kyn66 (11.11.2009 15:21:13) [13]
К вашему глубокому разочарованию, уважаемый житель города Эстония, вирусов у меня в системе нет, а проблема решена [22]
← →
Dennis I. Komarov © (2009-11-11 16:52) [25]
> житель города Эстония
мда...
← →
Leonid Troyanovsky © (2009-11-11 17:46) [26]
> 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.
← →
kyn66 © (2009-11-11 17:50) [27]
> If GetLastError=ERROR_ALREADY_EXISTS then
При повторном вхождении мы во второй блок ваще не попадаем, подразумевается что прога уже загружена. Просто выдаем сообщение и все на этом. Прога лежит в трэе. Я по иконке поле сообщения кликаю и она свободно поднимается без всяких там Application.CreateForm(TMainFrm, MainFrm); . По первому разу - да.
← →
Дмитрий Белькевич (2009-11-11 18:01) [28]
> Понятно то, что ошибка возникает в момент обращения к MainFrm.
> TrayIcon1. впринципе. А вот почему - не понятно.
Потому что MainFrm нужно вызывать в первой, полностью запущенной программе. А не во второй.
> Я по иконке поле сообщения кликаю и она свободно поднимается
> без всяких там Application.CreateForm(TMainFrm, MainFrm);
>
Я тебя разочарую. Когда ты кликаешь по иконке, то CreateForm(TMainFrm, MainFrm) уже давно произошел, иначе бы кликать не по чем еще было.
← →
Leonid Troyanovsky © (2009-11-11 18:08) [29]
> kyn66 © (11.11.09 16:30) [22]
> отца русской демократии :) http://gurin.tomsknet.ru/delphisingletonrun.
> html
Хотели, как лучше, получилось - как всегда.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2009-11-11 18:12) [30]
> kyn66 © (11.11.09 17:50) [27]
Иди букварь читать, двоечник.
--
Regards, LVT.
← →
kyn66 © (2009-11-11 19:03) [31]
> Leonid Troyanovsky © (11.11.09 18:12) [30]
Пока шел с работы - понял. Что даже при повторном запуске МЫ программу запускаем заново и этим управляет файл проекта. Поэтому для этого запуска форма главная еще не создана, отсюда и ошибка. Этот механизм[0]) хорош только для предварительно сообщения о запуске второй версии и все. Следовательно [1] здесь уже не прокатит.
> Хотели, как лучше, получилось - как всегда.
Ирония не уместна, как раз таки вариант [22] то что нужно!
> Иди букварь читать, двоечник.
Да не такой уж я и двоешник, просто люблю до истины докапаться, чтобы понятно было.
← →
Leonid Troyanovsky © (2009-11-11 19:20) [32]
> kyn66 © (11.11.09 19:03) [31]
> > Хотели, как лучше, получилось - как всегда.
> Ирония не уместна, как раз таки вариант [22] то что нужно!
Это почему ж?
--
Regards, LVT.
← →
kyn66 © (2009-11-11 19:25) [33]
> Это почему ж?
а к чему она? Не понятно.
← →
antonn © (2009-11-11 20:00) [34]
> Интересно конечно, но много писанины ради примитивного FindWindow.
> Не подходит.....
читал не внимательно, читай еще.
← →
kyn66 © (2009-11-11 20:22) [35]
> читал не внимательно, читай еще.
Что читать, за основу взят поиску по заглавию окна. А если в процессе работы заглавие меняется?
← →
Leonid Troyanovsky © (2009-11-11 20:25) [36]
> kyn66 © (11.11.09 19:25) [33]
> а к чему она? Не понятно.
До истины докопаться, чтобы понятно было.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2009-11-11 21:21) [37]> Leonid Troyanovsky (11.11.2009 20:25:36) [36]
Рассмешили и все равно не понятно.
← →
Leonid Troyanovsky © (2009-11-11 21:45) [38]
> Anatoly Podgoretsky © (11.11.09 21:21) [37]
> Рассмешили и все равно не понятно.
Да, не хотелось тот код обсуждать, бо с 2003 года лежит себе спокойно.
Без грубых ошибок, но и не без огрехов.
Особенно не нравятся рекомендации о правке файла проекта,
куда начинающим путь, во-ще, заказан.
Сложная проблема и с именованием объектов, хотя предложение
добавлять префиксом имя автора - весьма остроумно.
Ну, и мелочи всякие, сырой код, на коленке деланный,
а изображен как всамделишный.
--
Regards, LVT.
← →
Игорь Шевченко © (2009-11-11 21:47) [39]
> Особенно не нравятся рекомендации о правке файла проекта,
>
> куда начинающим путь, во-ще, заказан.
Что-то страсти какие-то рассказываются, про то, что файл проекта нельзя править :)
Борланд вроде не запрещает.
← →
Leonid Troyanovsky © (2009-11-11 21:58) [40]
> Игорь Шевченко © (11.11.09 21:47) [39]
> Что-то страсти какие-то рассказываются, про то, что файл
> проекта нельзя править :)
Начинающим - нельзя.
Запрещаю я :)
--
Regards, LVT.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.03;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c