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

Вниз

Проверка не запущена ли уже эта программа   Найти похожие ветки 

 
Надежда   (2007-08-07 15:12) [0]

Как можно в своей программе проверить не запущена ли уже эта программа на компьютере ? Пожалуйста, подскажите!


 
Сергей М. ©   (2007-08-07 15:26) [1]

Что такое "эта программа" ?


 
JanMihail ©   (2007-08-07 15:26) [2]

Ищешь окно по классу и по заголовку окна. Так как это твоя программа, ты их знаешь. Если такое есть, значит запущена.

if FindWindow(<класс окна>, <заголовок окна>) <> 0 then
 ShowMessage("Прога запущена")
else
 ShowMessage("Прога не запущена");


Ну это как простой вариант. Может быть и другая программа с таким классом и заголовком. Поэтому желательно какой-либо отличительный признак. Например создать класс TMyProgramAndTolkoMyProgram наследником класса TEdit. Затем поместить его на форму. И сделать проверку на еще одно условие.

if FindWindowEx(<хэндл окна>, 0, "TMyProgramAndTolkoMyProgram", nil) <> 0 then
 ShowMessage("Прога точно запущена")
else
 ShowMessage("Прога точно не запущена");


 
Сергей М. ©   (2007-08-07 15:27) [3]


> JanMihail ©   (07.08.07 15:26) [2]
>
> Ищешь окно по классу и по заголовку окна


Какое нафих окно, если программа как таковая вовсе не обязана создавать какие бы то ни было окна ?


 
JanMihail ©   (2007-08-07 15:32) [4]


> Какое нафих окно, если программа как таковая вовсе не обязана
> создавать какие бы то ни было окна ?

Но я так предполагаю, что автор новичок. И он не знает еще, что прога бывает без окон. Наверняка он запустил Delphi и появилась форма. Он и думает, что это и есть прога


 
Надежда   (2007-08-07 15:37) [5]

Окон в программе действительно нет. Есть моя программка, перекачивающая данные из одного хранилища в другое. Работает нормально. Но её не видно и иногда даже сама пытаюсь запустить её второй раз. А вот этого уже нельзя делать. Вот и требуется проверять : а не запустила ли я её уже. А с других рабочих мест она запускается по расписанию. Так что надеяться только на "человеческий фактор" не приходится. Посоветуйте, пожалуйста, как быть ?


 
Сергей М. ©   (2007-08-07 15:39) [6]


> Надежда   (07.08.07 15:37) [5]


см., к примеру, GlobalAddAtom, GlobalFindAtom, GlobalDeleteAtom


 
l_v   (2007-08-07 16:45) [7]

можно к примеру через реестр:
при запуске проверять значение какого-то созданного тобой параметра в реестре, если 0, то программа единственная и можно дальше работать и потом сразу же пишешь в этот параметр 1, а при завершении работы пишешь в тот параметр 0, если допустим 1, то значит прога запущена и выход.


 
Virgo_Style ©   (2007-08-07 16:47) [8]

l_v   (07.08.07 16:45) [7]

Если же программа вдруг упала - не вопрос, лезешь в реестр и ручками правишь значение


 
Сергей М. ©   (2007-08-07 16:49) [9]

[7], [8]

О боже)


 
l_v   (2007-08-07 16:52) [10]


> Virgo_Style ©   (07.08.07 16:47) [8]

ну это же как вариант, у вас постоянно все падает?


 
Virgo_Style ©   (2007-08-07 16:54) [11]

Сергей М. ©   (07.08.07 16:49) [9]

Кто-то тут жаловался, что люди не понимают, где стеб, а где нет... не напомните, кто? %-))


 
l_v   (2007-08-07 16:54) [12]


> Сергей М. ©   (07.08.07 16:49) [9]

спасибо за комплимент! первый раз меня называют богом... :)


 
Virgo_Style ©   (2007-08-07 16:56) [13]

l_v   (07.08.07 16:52) [10]
ну это же как вариант


По моему скромному мнению, плохой вариант еще можно предложить до хорошего, но никак не после)

P.S. На RSDN была целая статья на эту тему. Даже, кажется, с примером.


 
Сергей М. ©   (2007-08-07 16:58) [14]


> Virgo_Style ©   (07.08.07 16:54) [11]


Это жестокий стёб)

Можно ли он в дан.случае ? Сомневаюсь)


 
MetalFan ©   (2007-08-07 17:04) [15]

mutex самое отличное решение имхо


 
ASoft   (2007-08-07 17:42) [16]

простое решение, создать файл, к примеру в \temp, с флагом на удаление после завершения приложения. При старте проверять его наличие..


 
Leonid Troyanovsky ©   (2007-08-07 17:51) [17]


> Сергей М. ©   (07.08.07 15:39) [6]

> см., к примеру, GlobalAddAtom, GlobalFindAtom, GlobalDeleteAtom

Даже смотреть не стоит.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-08-07 18:01) [18]


> Надежда   (07.08.07 15:37) [5]

> Окон в программе действительно нет. Есть моя программка,
>  перекачивающая данные из одного хранилища в другое. Работает
> нормально.

Если это не консольное приложение, то оно не получит уведомления,
например, о завершении сессии.
А если консольное, то его, все же, можно увидеть.

Проще всего, для начала, сделать ему окно (или форму)
хотя бы и невидимые.

--
Regards, LVT.


 
Virgo_Style ©   (2007-08-07 18:31) [19]

ASoft   (07.08.07 17:42) [16]

Действительно, гораздо удобнее, в случае падения программы ручками надо не в реестр лезть, а всего лишь файл удалить.

p.s. Это - стеб.
p.p.s. http://rsdn.ru/article/baseserv/avins.xml - а это статья.


 
Virgo_Style ©   (2007-08-07 18:34) [20]

Virgo_Style ©   (07.08.07 18:31) [19]
Действительно, гораздо удобнее, в случае падения программы ручками надо не в реестр лезть, а всего лишь файл удалить.


Не разглядел "флаг на удаление после завершения", виноват... но все равно метод несколько "через Париж в Мытищи", imho.


 
ASoft   (2007-08-07 18:46) [21]

грубо говоря, я имел в виду что-то на подобие

 if FileExists(FileName) then
   begin
    if not DeleteFile(FileName) then
     begin
       Application.MessageBox("too copy" ,"Run My prog",MB_ICONWARNING or MB_SYSTEMMODAL);
 //        Application.Terminate;
     end;
   end;
............
   CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
   FILE_SHARE_READ or FILE_SHARE_WRITE, nil,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0)
....


 
Leonid Troyanovsky ©   (2007-08-07 19:17) [22]


> Virgo_Style ©   (07.08.07 18:34) [20]

> .. но все равно метод несколько "через Париж в Мытищи",

Несколько это сколь?

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2007-08-07 19:40) [23]

Мужики да вам witness сервер просто крайне необходим.


 
MetalFan ©   (2007-08-07 20:15) [24]

повторюсь: используйте mutex"ы. они вроде уничтожаются при завершении создавшего их процесса...


 
Virgo_Style ©   (2007-08-07 21:14) [25]

Leonid Troyanovsky ©   (07.08.07 19:17) [22]
Несколько это сколь?


- Петька, приборы!
- Двадцать!
- Что двадцать?
- А что приборы??

Работа с файлами для этой задачи imho ни к чему. И еще, я подозреваю, что у этого файла все же есть шанс выжить, например при выключении reset"ом, сбое питания и так далее. Возможно я и ошибаюсь.


 
trubin ©   (2007-08-07 21:17) [26]


> повторюсь: используйте mutex"ы. они вроде уничтожаются при
> завершении создавшего их процесса...

Или другие именованые объекты ядра: события, проекции файлов ...


 
ASoft   (2007-08-08 04:51) [27]


> Virgo_Style ©   (07.08.07 21:14) [25]
>И еще, я подозреваю, что у этого файла все же есть шанс выжить, например при выключении reset"ом, сбое питания и так далее...

ага, не исключено:) Для этого я и установил проверку в начале своего примера
if FileExists(FileName) then
  begin
  if not DeleteFile(FileName) then
    begin
...

Если есть такой файл и его можно удалить, то можно предположить, что твое приложение было завершено аварийно
Конечно, такой способ не панацея, только как альтернатива и имхо..:-)


 
Надежда   (2007-08-13 13:06) [28]

Всем СПАСИБО. Особенно Вам, Сергей М. ! Всё получилось.


 
Leonid Troyanovsky ©   (2007-08-13 13:46) [29]


> Надежда   (13.08.07 13:06) [28]

> Всё получилось.

А это только кажется.

Запусти приложение, затем сними диспетчером.
Попытайся запустить снова. Сюрприз?

Кроме того, не стоит пренебрегать и окончанием сессии.
Т.е., попытайся при работающем приложении сделать логоф.
IMHO, проще сделать Application.ShowMainForm := False,
и работать с ним, как с обычным оконным приложением.

--
Regards, LVT.



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

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

Наверх




Память: 0.54 MB
Время: 0.028 c
15-1186529949
lookin
2007-08-08 03:39
2007.09.02
Время просчета пустой процедуры


3-1178351086
RomanH
2007-05-05 11:44
2007.09.02
Случайный disconect c СУБД


4-1173645922
Анонимщик1
2007-03-11 23:45
2007.09.02
WaitForMultipleObject, Event, ReadDirectoryChangesW, AV


8-1164166516
Tab
2006-11-22 06:35
2007.09.02
Совместное использование OpenGL и VCL компонент


2-1186399521
AlinaVK
2007-08-06 15:25
2007.09.02
constraint