Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
Надежда   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.045 c
3-1178790763
Godness
2007-05-10 13:52
2007.09.02
A query with LOB s requires OCI8 mode, but OCI7 mode is used


15-1186320574
@!!ex
2007-08-05 17:29
2007.09.02
Два дня не был на форуме...


6-1168779369
@gent
2007-01-14 15:56
2007.09.02
Как скрытно зайти на страницу ?


2-1186559531
Sdubaruhnul
2007-08-08 11:52
2007.09.02
Правила wildcard


15-1186051262
{RASkov}
2007-08-02 14:41
2007.09.02
С Днём ВДВ! 2 Августа.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский