![]() |
| ||
|
|
Новости |
Поиск |
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 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]Как «спрятали» в трей, так и доставайте обратно.