Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.009 c
1-1232385856
Илья_
2009-01-19 20:24
2010.01.03
Рисование картинки из ImageList методом StrechDraw


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


15-1256994371
TUser
2009-10-31 16:06
2010.01.03
К дню политзаключенного. Чисто исторический вопрос.


1-1231953992
Тыщ
2009-01-14 20:26
2010.01.03
Как использовать строковые константы в asm..end?


2-1258016441
Иван
2009-11-12 12:00
2010.01.03
Как экспортировать ListView в Excel?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский