|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Т.Е. если оно уже запущено (например свернуто окно, а пользователь его не видит, то просто развернуть его). Нужна очень эта "защита от дураков" ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2004, 15:09 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
http://www.sql.ru/forum/actualthread.aspx?tid=88788 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2004, 15:11 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Да.. ?! А если заголовок окна приложения меняется в самом приложении, например содержит имя пользователя, работающего в данный момент с приложением ? С уважением, Алексей. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2004, 22:08 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Тебе поможет объект ядра мьютекс. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2004, 22:22 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Простейший вариант: -) На стороне клиента создается свободный DBF (пустой, с одним полем) -) При открытии приложения этот DBF открывается в режиме EXCLUSIVE -) Если получили ошибку " File access is denied (Error 1705) " значит приложение уже открыто Одновременно, этот файл может служить признаком корректного завершения приложения, если его удалять при закрытии приложения. Т.е. если при входе в приложение файл уже существует и еще не открыт в режиме EXCLUSIVE, значит последнее завершение приложения было некорректно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 09:42 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Вариант с DBF хороший, я сам его использовал. Очень редко, но все-таки случались ситуации, когда с момента старта программы до открытия контрольного файла программа успевала все-таки загрузиться дважды, но в принципе работает. Отказался потому, что требовалось запускать программу реально несколько раз параллельно для работы с разными базами данных. Использовал так-же вариант открытия контрольного окна, сейчас уже не помню почему, но и от него отказался. Из всех вариантов на фоксе самые надежные результаты мне дал вариант, когда после старта программы выдается приглашение на ввод сегодняшнего числа (например). Программа может загрузиться несколько раз, но если пользователь не ввел дату в которой он хочет работать (разумеется для даты сегодня достаточно было нажать всего одну кнопку), то через одну минуту приложение не получив отклика юзера корректно закрывается. Разумеется сколько-бы раз программа не стартовала, ответ от юзера получит только одна сессия. В насстоящее время кроме этого я использую специально написанный на VC+ MFC стартер с вариантом Mutex. Результат прекрасный. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 13:39 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Чем такой подход не нравиться ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
Не все ошибки выполнения функций обработаны, но это уже дело вкуса. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 14:26 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Маленькая неточность, нужно вот так : Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 14:29 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
2 luser Надо соблюдать правила хорошего тона: ReleaseMutex(hMutex) - в данном случае ни на что не влияет, поскольку синхронизация у тебя идет не через Wait функции CloseHandle(hMutex) - а вот без этого под 98 у тебя может случится конфуз - вроде ты и вышел из приложения, а повторно зайти не можешь ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 18:30 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Cогласен. Даже не знаю, почему я написал Release, видимо о чем-то еще думал. Хорошее конструктивное замечание. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 18:33 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
>> а вот без этого под 98 у тебя может случится конфуз не понял, какой может быть конфуз. Mutant также убъется при выгрузке приложения, как и в другой Windows или я не прав ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2004, 12:31 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Как вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
Пример использования: Код: plaintext 1. 2. 3.
duШes ....return ThisForm.exGrid1.p_oColumns("COLUMN1").M_AddHeader("header4",4) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2004, 09:19 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Hi Dushes! Угу, это понятно. Кстати имя процесса в системе - НЕ ЕСТЬ уникальный его идентификатор. Тогда уж стоит вынимать и полный путь к модулю (учитывая особенности для процессов запускаемых при Boot-инге системы в обращении к элементам ФС). Мне тут почему-то вспомнился троян, маскировавшийся под svchost.dll, и даже прописавшийся в %WINDIR% - тогда как "настойщий" svchost обитает в %WINDIR%\system32. Также не вполне очевидны особенности работы такого метода под Terminal Services - но там вообще масса нюансов :) Posted via ActualForum NNTP Server 1.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2004, 05:42 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Привет, Игорь. Мое мнение таково что данный вариант всяко лучше чем отслеживать капшн окна приложения, к тому же как правило само приложение запускается из одного каталога (в пределах клиентской станции)...Если принять что имя процесса не есть уникальное название, ничто не мешает использовать AGETFILEVERSION для проверки компании, автора, номера версии и пр... К тому же, получив хэндл приложения, используя API, не трудно определить стартовый каталог приложения....но это опять-таки особенности реализации;)... С уважением duШes ....return This.MultiColumnTreView.p_oNodes["key_node_13"].p_oSubItems[3].p_cText ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2004, 08:57 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Делается так: Работает на 98/2000/XP DECLARE INTEGER OpenEvent IN kernel32 AS oe ; integer a, integer b, String c DECLARE INTEGER CreateEvent IN kernel32 AS ce ; integer b1,integer b2,integer b3, String c1 IF NOT EMPTY(oe(1,0,"666")) MESSAGEBOX('Программа уже запущена!',16,'Ошибка') QUIT ENDIF ce(0,0,1,"666") ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2004, 09:57 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
А какая разница ? :)) Что мьтекс , что событие объекты ядра :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2004, 13:24 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Тогда уж самый просто способ, до загурзки главного окна делать Declare Integer FindWindow in Win32Api string @, string @ Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2004, 13:36 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Наоборт : Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2004, 13:37 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Hi luser! Нет, по заголовку искать - это плохо - заголовок может изменяться - причём достаточно много ситуаций к этому ведут. Всё-же объекты ядра это значительно надёжнее. А из них для этой цели лучше всего подходит именно Mutex. Posted via ActualForum NNTP Server 1.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2004, 02:12 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
http://vfpdev.narod.ru/util_r.html А там к предотвращению повторного запуска приложения, если заголовок основного окна может меняться http://vfpdev.narod.ru/download/multex.zip ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2004, 09:30 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
>> А из них для этой цели лучше всего подходит именно Mutex. А почему именно Mutex? В данной ситуации абсолютно все равно: Mutex, Event, Semaphore или кто еще чего знает. У них у всех общее свойство - уникальное в пределах системы имя (что вобщем-то есть у файлов) и автоматическое "удаление из системы" в случае краха процесса, который их создал (чего нет у файлов). То чем они отличаются, для данной задачи не имеет никакого значения. Пишу только затем, чтобы люди не кинулись переделывать программы где используются не Mutex на Mutex ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2004, 15:43 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
То oleg_km: Подходит именно потому, что именно этих целей и предназначен, в отличии от всего другого. Вообщем потому что так "партия" приказала, если будет угодно ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2004, 15:49 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
>> Подходит именно потому, что именно этих целей и предназначен Ну тогда чушь это. Если на то пошло, Mutex предназначен что бы его один процесс захватывал через WaitForSingleObject (например), а другой/другие процесс/ы ждал, используя ту же функцию, пока первый освободит этот Mutex, используя ReleaseMutex. Ну и где в данном случае используется хоть одна из этих функций? Данное использование объектов ядра вообще-то является, скажем так, трюком, побочным использованием свойств этих объектов. А Mutex не больше подходит для этих целей, просто в KB Microsoft именно Mutex использовала для примера, как предотвратить повторный запуск приложений, потому как использовавшийся ранее (в Win16) способ в Win32 перестал работать. Я это все к тому, что если кто-то реализовал это через Event например, переделывать ничего не нужно, никакая "партия" ничего не приказывала. Просто задевает то, что мы все грамотные люди, принимаем только проверенные вещи, а в данном случае как-то это шаманством отдает. Короче, нет слов ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2004, 18:17 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Что ж ты неугомонный такой ? Амбициозный и неугомонный. Вам, сэр - прямая дорога в МSDN в раздел "сихронизация потоков и процессов". Надеюсь по английски читаете свободно. А вот то что вы написало в прошлом посте точная чушь. Вообщем читайте, изучайте, пробуйте, потом амбиции Ваши будем обсудать. Пока я вижу с Вами обсуждать нечего. Все слишком сильно запущено. =Тему можно закрывать= ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2004, 19:00 |
|
Как сделать, чтобы приложение не запускалось второй раз
|
|||
---|---|---|---|
#18+
Hi oleg_km! 1) Никто не говорил переписывать работающий код. 2) Надеюсь у Вас не вызывает сомнения, что микроскопом (самым заурядным, оптическим) МОЖНО забивать гвозди? Причём достаточно эффективно. 3) С чего вы решили, что создаваемый Mutex не захватывается? В каноническом коде он именно и захватывается при создании! И "отпускается на волю" при завершении приложения. Совсем иное дело, что Wait* функции реально не используются В ДАННОМ КОНТЕКСТЕ - ибо мы не запускаем ДРУГОЕ приложение, которое должно дождаться завершения данного для своей работы. Но такая ситуация вполне возможна. Особенно если в сисеме помимо обычных интерактивных (GUI) приложений фунциклируют ещё и демоны/сервисы/BatchJob-ы и тому подобное "подковёрное" ПО. Posted via ActualForum NNTP Server 1.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2004, 01:10 |
|
|
start [/forum/topic.php?fid=41&fpage=19&tid=1582123]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 258ms |
total: | 424ms |
0 / 0 |