Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.03;
Скачать: CL | DM;

Вниз

Запуск программы(только 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
1-1232613443
harisma
2009-01-22 11:37
2010.01.03
Использование AdjustClientRect


2-1257950877
Alexey
2009-11-11 17:47
2010.01.03
Поток, передача параметра в onTerminated


2-1257999548
Андрей Смирнов
2009-11-12 07:19
2010.01.03
Как доработать функцию поиска, для работы в цикле?


3-1232432122
pavel_guzhanov
2009-01-20 09:15
2010.01.03
Проблема с памятью


15-1257115787
Германн
2009-11-02 01:49
2010.01.03
Я правильно понял, что Visual Basic от MS бесплатен?