Главная страница
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.


 
Leonid Troyanovsky ©   (2009-11-11 22:00) [41]


> Leonid Troyanovsky ©   (11.11.09 21:45) [38]

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

--
Regards, LVT.


 
Игорь Шевченко ©   (2009-11-11 22:00) [42]

Leonid Troyanovsky ©   (11.11.09 21:58) [40]

Начинающие вообще должны 7 лет отходы от набивки перфокарт за мастерами вытряхивать, прежде чем хоть что-то начать писать :)


 
Leonid Troyanovsky ©   (2009-11-11 22:03) [43]


> Игорь Шевченко ©   (11.11.09 22:00) [42]

> Начинающие вообще должны 7 лет отходы от набивки перфокарт
> за мастерами вытряхивать, прежде чем хоть что-то начать
> писать :)

Ну,  во-щем-то, да.
И не забывать про медитацию.

--
Regards, LVT.


 
Loginov Dmitry ©   (2009-11-11 22:06) [44]

> Но, при запуске программы под другим пользователем(например,
> если вошли через удаленный рабочий стол) она запустится.
> Кстати, кто-нибудь знает, как от этого избавиться?


http://delphimaster.net/view/1-1255714707/&toprint=1


 
antonn ©   (2009-11-11 22:14) [45]


> kyn66 ©   (11.11.09 20:22) [35]
>
>
> > читал не внимательно, читай еще.
>
>
> Что читать, за основу взят поиску по заглавию окна. А если
> в процессе работы заглавие меняется?

такой основы там нет.


 
Anatoly Podgoretsky ©   (2009-11-11 22:41) [46]

> Leonid Troyanovsky  (11.11.2009 21:45:38)  [38]

Ну это общая практика TLVTStopTwo


 
Anatoly Podgoretsky ©   (2009-11-11 22:43) [47]

> Игорь Шевченко  (11.11.2009 21:47:39)  [39]

Ну один догадался включить букву "я" в первые 256 байтов проекта.


 
Anatoly Podgoretsky ©   (2009-11-11 22:43) [48]

> Leonid Troyanovsky  (11.11.2009 22:03:43)  [43]

И ку


 
Leonid Troyanovsky ©   (2009-11-11 23:04) [49]


> Anatoly Podgoretsky ©   (11.11.09 22:41) [46]

> Ну это общая практика TLVTStopTwo

Я б звал вТуСтепь.

> И ку

А то :)

--
Regards, LVT.


 
kyn66 ©   (2009-11-12 01:09) [50]


> Игорь Шевченко ©   (11.11.09 22:00) [42]
> Leonid Troyanovsky ©   (11.11.09 21:58) [40] Начинающие
> вообще должны 7 лет отходы от набивки перфокарт за мастерами
> вытряхивать, прежде чем хоть что-то начать писать :)


Дедовщиной попахивает!


 
kyn66 ©   (2009-11-12 01:14) [51]


> antonn ©   (11.11.09 22:14) [45]
> > kyn66 ©   (11.11.09 20:22) [35]> > > > читал не внимательно,
>  читай еще.> > > Что читать, за основу взят поиску по заглавию
> окна. А если > в процессе работы заглавие меняется?такой
> основы там нет.


if GetLastError = ERROR_ALREADY_EXISTS then
   Begin
     Result := False;
     {$WARNINGS OFF}
     hWnd := FindWindow("TApplication", PAnsiChar(aWndName));
     {$WARNINGS ON}
     if aMessage then
       MessageBox(0, MSG_APP_ALREDY_EXIST, "Внимание!", MB_ICONWARNING or MB_OK or MB_TOPMOST or MB_APPLMODAL);
     If aFlash then
       FlashWindow(hWnd, True);
     If aRestore then
       Begin
         ShowWindow(hWnd, SW_RESTORE);
         SetForegroundWindow(hWnd);
       end;
   end
 Else
     Result := True;


 
antonn ©   (2009-11-12 01:55) [52]


> kyn66 ©   (12.11.09 01:14) [51]

{$WARNINGS OFF}
 hMutex := CreateMutex(Nil, true , PAnsiChar(aName));
 {$WARNINGS ON}
 if GetLastError = ERROR_ALREADY_EXISTS then
   Begin

вот это - основа. А то что внутри - механиз оповещения уже запущенной копии, передачи ей данных и прочего. О чем в [0] не сказано, можно поудалять.


 
Игорь Шевченко ©   (2009-11-12 02:55) [53]

antonn ©   (12.11.09 01:55) [52]

А зачем {$WARNINGS OFF} ?


 
Riply ©   (2009-11-12 03:11) [54]

> [53] Игорь Шевченко ©   (12.11.09 02:55)
> antonn ©   (12.11.09 01:55) [52]
> А зачем {$WARNINGS OFF} ?

Для соместимости с unicode-версиями среды, наверное :)


 
kyn66 ©   (2009-11-12 10:55) [55]


> вот это - основа. А то что внутри - механиз оповещения уже
> запущенной копии,


А поднимать из трэя как будет? По имени окна.... Хоть это и не основной момент, но без него никак не поднять в данном предложенном варианте.[35]


 
Leonid Troyanovsky ©   (2009-11-12 19:14) [56]


> kyn66 ©   (12.11.09 10:55) [55]

> и не основной момент, но без него никак не поднять в данном
> предложенном варианте.[35]

Хороший вопрос.

Если запихать хендлы искомых окон в mmf, то нет
никакой гарантии, что с момента их прочтения они не
поменяют свою принадлежность к изначальным окнам.

В случае с мьютексом можно найти способ известить
ищущего нужное окно, о том, что владевший окном
поток бросил мютекс (WAIT_ABANDONED),
и, сл-но, дальнейшие поиски излишни.

Т.е., еще есть над чем подумать.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2009-11-12 19:19) [57]


> Leonid Troyanovsky ©   (12.11.09 19:14) [56]

> и, сл-но, дальнейшие поиски излишни.

Ну, а захвативший мьютекс получает право создавать окна.

Хотя, во всей этой схеме родовой изъян - необходимость
именования объекта ядра.

--
Regards, LVT.



Страницы: 1 2 вся ветка

Текущий архив: 2010.01.03;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.014 c
15-1257003526
stas
2009-10-31 18:38
2010.01.03
пустой exe определяется как троян


15-1256904303
@!!ex
2009-10-30 15:05
2010.01.03
UpTime домашнего сервера 5.43 месяца...


15-1256225989
Empleado
2009-10-22 19:39
2010.01.03
Поднять облака! Интересно, о какой "установке" идет речь ?...


15-1257160759
JohnKorsh
2009-11-02 14:19
2010.01.03
Не посоветует ли кто книгу по работе с сетями из Дельфи?


11-1209885490
ForestGamp
2008-05-04 11:18
2010.01.03
OnQueryEndSession