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 15:39:00) [41]

> kyn66  (11.11.2009 15:05:11)  [11]

Меня смущает распространение вируса, особо, что тебе это известно.


Leonid Troyanovsky   (2009-11-11 15:28:00) [42]


> GanibalLector ©   (11.11.09 14:48) [9]

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

http://msdn.microsoft.com/en-us/library/aa382954(VS.85).aspx

--
Regards, LVT.


RWolf   (2009-11-11 15:26:00) [43]

Для профилактики дальнейшего распространения индюка — создайте C:\Program Files\Borland\Delphi7\Lib\sysconst.bak с любым содержимым. Также не мешает закрыть от записи каталоги Lib и Source.


RWolf   (2009-11-11 15:24:00) [44]


> kyn66


проверьте все *.dcu, *.exe на вхождение строки «$bak$». Найденные — сотрите.


kyn66   (2009-11-11 15:21:00) [45]


> http://forum.sources.ru/index.php?showtopic=279176


не открывается ссылка.


antonn   (2009-11-11 15:14:00) [46]


> kyn66 ©   (11.11.09 14:54) [10]
>
> После перзагрузки ситуация повторилась(Аваст видит вирус).
>  Но видит он его где?

http://forum.sources.ru/index.php?showtopic=279176


kyn66   (2009-11-11 15:05:00) [47]


> Anatoly Podgoretsky ©   (11.11.09 14:35) [8]
> > kyn66  (11.11.2009 13:40:05)  [5]И ты собираешься это
> распространять.


Да собираюсь, после устранения ошибки. А что смущает в [5]?


kyn66   (2009-11-11 14:54:00) [48]

После перзагрузки ситуация повторилась(Аваст видит вирус). Но видит он его где? В параллельной папке лежал ехе-шник, для других целей, с точно таким именем, ка основная прога. Так вот почему-то аваст находил в нем вирус, хотя при запуске он никакого отношения не имел. В нем мог и быть вирус, давно лежит. После первого упоминания о индуке проверял весь комп. НУ это ладно, тот файл удалил. Почему он цеплялся при поиске snjhjq копии в памяти? Сейчас выдает Access Violation/Gjghj,e. искать в каком месте. Но код то по идее верный с вызовом через MainFrm.TrayIcon1.ShowMainForm;?


GanibalLector   (2009-11-11 14:48:00) [49]

Можно и семафор


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;



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


Anatoly Podgoretsky   (2009-11-11 14:35:00) [50]

> kyn66  (11.11.2009 13:40:05)  [5]

И ты собираешься это распространять.


Kolan   (2009-11-11 14:18:00) [51]

Еще для определения запущенной копии можно использовать мьютекс.


RWolf   (2009-11-11 13:44:00) [52]

Нет, это действительно вирус. Лечите.


kyn66   (2009-11-11 13:40:00) [53]

Использую TCoolTrayIcon. Добавил строку

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


Результат ошеломил! После первого запуска Аваст заорал, что моя прога заражена вирусом Induc. При компиляции все нормально. ЗАпускаю второй раз - обломс. "Приложение будеи закрыто. Приносим свои извенения."...
Вот это чудо... Грабли?


sniknik   (2009-11-11 13:34:00) [54]

для гарантированного освобождения ресурсов используют try finally, и обычно (или просто чаще видел) для этих целей используют мютексы.


antonn   (2009-11-11 13:34:00) [55]

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


Дмитрий Белькевич   (2009-11-11 13:34:00) [56]

Как прячешь в трей? Я свои, например, прячу компонентой cooltrayicon. Она же и вытаскивать из трея умеет. А ты как вытаскиваешь? Ну так вот - этот же код вызывай из другой копии программы в первой. Как-то первой копии сообщив, что пытается запуститься вторая.


Kolan   (2009-11-11 13:25:00) [57]

Как «спрятали» в трей, так и доставайте обратно.


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

Наверх

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