-
Как узнать, сколько копий приложения работает в данный момент времени?
-
1. Создать Memory Mapped File в страничной памяти системы (см. CreateFileMapping и MapViewOfFile) размером 4 байта.
2. Эти 4 байта содержат счетчик запущенных копий. Каждая новая запущенная копия инкрементирует его.
-
Уточнение:
мне даже не важно знать сколько именно копий работает,
а достаточно лишь знать работают ли еще другие копии программы в данный момент или нет?
-
> тКнопка (11.04.08 00:18) [2]
Совет [1] вполне подходит.
-
-
> Семеныч (11.04.08 01:02) [4]
То обсуждение не было "завершено". Бо сам вопрос попытки повторного запуска приложения гораздо более сложный. В архивах можно найти более плодотворное обсуждение данного вопроса, но нет времени/желания копаться в архивах.
-
> Германн © (11.04.08 01:25) [5]
> нет времени/желания копаться в архивах.
И смысла тоже - для профи вопрос совершенно ясен и без архивов.
-
> 1. Создать Memory Mapped File в страничной памяти системы
> (см. CreateFileMapping и MapViewOfFile) размером 4 байта.
>
>
> 2. Эти 4 байта содержат счетчик запущенных копий. Каждая
> новая запущенная копия инкрементирует его.
Это плохой способ. Каждая умершая не своей смертью копия оставит свой след в этом счетчике. Что мешает просто пройтись по процессам любым доступным способом и посмотреть, из какого модуля они запускались?
-
> DrPass © (11.04.08 01:33) [7]
>
>
> > 1. Создать Memory Mapped File в страничной памяти системы
> > (см. CreateFileMapping и MapViewOfFile) размером 4 байта.
>
> >
> >
> > 2. Эти 4 байта содержат счетчик запущенных копий. Каждая
> > новая запущенная копия инкрементирует его.
>
> Это плохой способ. Каждая умершая не своей смертью копия
> оставит свой след в этом счетчике.
Это нормальный способ для нормальных случаев. Параноики могут использовать любые другие способы по их выбору. :)
Не прими на свой счёт.
-
> DrPass © (11.04.08 01:33) [7]
Верно. Но этот способ более трудоемок и какой выбрать (более простой или более точный) - это зависит от требований задачи. В данном случае, как выяснилось, даже и счетчика не нужно.
-
> Семеныч (11.04.08 01:41) [9]
>
> > DrPass © (11.04.08 01:33) [7]
>
> Верно. Но этот способ более трудоемок и какой выбрать (более
> простой или более точный) - это зависит от требований задачи.
> В данном случае, как выяснилось, даже и счетчика не нужно.
>
>
В этом случае ещё ничего не известно. Судя по [0] и [2]. По моему опыту знаю, что возможен допвопрос: "Если уже запущена моя программа, то как ей передать командную строку".
-
> DrPass © (11.04.08 01:33) [7]
... Что мешает просто пройтись
> по процессам любым доступным способом и посмотреть, из какого
> модуля они запускались?
А может-ли кто-нибудь показать простейший пример?
-
> тКнопка (11.04.08 02:08) [11]
>
>
> > DrPass © (11.04.08 01:33) [7]
> ... Что мешает просто пройтись
> > по процессам любым доступным способом и посмотреть, из
> какого
> > модуля они запускались?
>
>
> А может-ли кто-нибудь показать простейший пример?
>
Тебя испугало "Memory Mapped File"? Тогда простейший пример тебя испугает ещё больше. Лучше сразу напиши "дайте код!".
-
> Германн © (11.04.08 02:17) [12]
...
> Тебя испугало "Memory Mapped File"? Тогда простейший пример
> тебя испугает ещё больше. Лучше сразу напиши "дайте код!
> ".
Нет, такой способ ( "Memory Mapped File" ) мне не подходит.
Мне нужно пройтись по процессам, как подсказывает DrPass .
Дайте код!
-
> [13] тКнопка (11.04.08 02:30)
> Нет, такой способ ( "Memory Mapped File" ) мне не подходит.
> Мне нужно пройтись по процессам, как подсказывает DrPass .
> Дайте код!
"пройтись по процессам" не совсем то, что надо.
Зависит от причин по которым нельзя допустить второй запуск.
Пользователь может запустить программу под разными именами (переименовывая exe-файл)
-
> Riply © (11.04.08 02:40) [14]
Саш. Дай ему код. Но в "черновике". Пусть поймёт всю сложность задачи.
-
> Германн © (11.04.08 02:53) [15]
>
>
> > Riply © (11.04.08 02:40) [14]
>
> Саш. Дай ему код. Но в "черновике". Пусть поймёт всю сложность
> задачи.
>
Не. Не так сформулировал.
Дай ему код в "наброске".
-
Уточню. Задача такая: при закрытии программы, нужно проверить, если больше нет запущенных копий программы, то нужно удалить временную попку и все ее соджержание.
-
> тКнопка (11.04.08 02:59) [17]
>
> Уточню. Задача такая: при закрытии программы, нужно проверить,
> если больше нет запущенных копий программы, то нужно удалить
> временную попку и все ее соджержание.
>
Эээ. Если не обращать внимание на "некую скабрезность вопроса", то чем не устраивают ответ [1]?
-
> тКнопка (11.04.08 02:59) [17]
Сделай проще. Создай в этой "попке" файл а в нем счетчик и будет у тебя программа завершаться через проверку попки =)))
-
Упс, ошибка, "временная папка".
А если электричество выключат, ведь счетчики останутся? И там еще предусмотренно аварийное востановление. и т.д. ...
Вобщем, я решил остановиться на EnumWindows! Так можно? Дайте код! :)
-
> тКнопка (11.04.08 03:38) [20]
>
> Упс, ошибка, "временная папка".
>
> А если электричество выключат
А если электричество выключат, Это уже не твоя забота, если твоя задача не разработка "системы жизнеобеспечения"!
-
Для енумерации процессов у пользователя из под которого запущена прога может банально не хватить прав. А работать под админом - зло.
-
EnumWindows подойдет?
-
EnumProcesses или Process32First/Next
-
Кошмар.
И ведь всего-то надо, чтобы программа держала папку открытой, а перед завершением закрывала и удаляла. Типа "не удалилась - значит, ее еще кто-то держит, да и ладно".
И никаких копий вообще определять не нужно.
-
> clickmaker © (11.04.08 11:41) [24]
> EnumProcesses или Process32First/Next
[Pascal Error] Unit3.pas(29): E2003 Undeclared identifier: 'Process32First'
[Pascal Error] Unit3.pas(30): E2003 Undeclared identifier: 'EnumProcesses'
-
> [26] тКнопка (11.04.08 19:41)
Ctrl+F ищи и подключай необходимые модули... так же просто F1 может помочь...
-
> KSergey © (11.04.08 07:44) [22]
> Для енумерации процессов у пользователя из под которого
> запущена прога может банально не хватить прав. А работать
> под админом - зло.
Это что значит, EnumProcesses или Process32First/Next не подойдет?
-
Можно еще использовать мьютексы.
-
> Уточню. Задача такая: при закрытии программы, нужно проверить,
> если больше нет запущенных копий программы, то нужно удалить
> временную попку и все ее соджержание.
Удаляй временную папку при старте первого экземпляра. Это гораздо проще.
-
> Loginov Dmitry © (11.04.08 23:04) [30]
> Удаляй временную папку при старте первого экземпляра. Это
> гораздо проще.
>
И не проще (судя по сабжу) и неверно по сути.
-
> [25] Семеныч (11.04.08 14:26)
а если не нужна проге папка?
-
> clickmaker © (12.04.08 19:06) [32]
Тогда плохо. Тогда придется прочесть ветку. Ну пусть не всю, но хотя бы [0] и [17]
-
> Семеныч (12.04.08 22:19) [33]
> Тогда плохо. Тогда придется прочесть ветку. Ну пусть не
> всю, но хотя бы [0] и [17]
Дык, все равно, непонятно, зачем каждый раз создавать-удалять папку.
А файлы можно создать with FILE_ATTRIBUTE_TEMPORARY & FILE_FLAG_DELETE_ON_CLOSE - FAF.
--
Regards, LVT.