|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Тема старая и неплохо изложенная здесь , но возникли такие вопросы: - Как определить, что запущено моё приложение, а не "однофамилец"? (т.е. "вдруг" у чужого ПО есть такой же заголовок у окошка, либо ПО имеет одноименный запускающий файл) - Как определить, что уже запущен экземпляр моего ПО, но не из оригинального, а переименованного запускающего файла? (т.е. пользователь изменил "myapp.exe" на "myapp_2.exe" и может запускать одновременно два и т.д. экземпляров ПО) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 09:24 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
1. придумайте заголовок приложения уникальный. например app v.1.0 build 111 01.01.2011 2. так при запуске приложения проверяйте как назівается его ехе ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 09:32 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
27.04.2011 10:24, AIS пишет: > Тема старая и неплохо изложенная здесь > < http://www.rsdn.ru/article/baseserv/avins.xml>, но возникли такие вопросы: Вопросов возникать не должно, ибо на них были даны ответы ;). > - Как определить, что запущено моё приложение, а не "однофамилец"? > - Как определить, что уже запущен экземпляр моего ПО, но не из > оригинального, а переименованного запускающего файла? Mutex. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 10:13 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
roleks... 2. так при запуске приложения проверяйте как назівается его ехе Вот я и говорю: Проверил... Такого как "myapp.exe" нет, а по факту есть "myapp_2.exe", которое не определяется, т.к. имя другое, которого я знать не могу. И получается, что два (в частности, а может и более) ПО работают одновременно. Dim2000...Mutex Да, это решение, им и пользовался, но т.к. появились вопросы, то заинтересовал вариант - пробежаться по процессам и определить *.ехе файл, у которого совпадает (например) MD5 файла с оригиналом. И таким образом определить то ли это приложение, либо нет. Может это лучше и надежней? Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 12:13 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
AISМожет это лучше и надежней? Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла. А чем это лучше и надежней? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 15:16 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Локшин МаркAISМожет это лучше и надежней? Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла. А чем это лучше и надежней? Может быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 15:46 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Правда к "оконным" функциям всё равно пришлось обратится (другого способа не нашел), чтобы сделать restore и вывести 1-ый экземпляр ПО на передний план. Но это уже потом, после успешного теста на "дубликат". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 15:54 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
AISМожет быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО. Чем это лучше, чем мьютекс? А дополнительная возможность проверки ПО - в качестве защиты это легко ломается, зато при каждой перекомпиляции программы вставлять в нее нужную сумму - будет дополнительное веселье. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 15:54 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Локшин МаркAISМожет быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО. Чем это лучше, чем мьютекс? А дополнительная возможность проверки ПО - в качестве защиты это легко ломается, зато при каждой перекомпиляции программы вставлять в нее нужную сумму - будет дополнительное веселье. А придумывать для Mutex уникальное значение - это надёжно? И делать это для "каждой перекомпиляции программы"? А вообще, мысли были не о защите, а четком срабатывании ПО на "дубликат", чтобы не было "ложных" срабатываний. Да и какое "веселье" с компиляцией? Программа может использовать банальный алгоритм: Код: plaintext 1. 2. 3. 4. 5.
Но вот если имя запускающего файла искажено (неважно даже у 1-го либо 2-го экземпляра), то второй экземпляр не запустится. И если это будет один из элементов защиты, то "кашу маслом не испортишь". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 16:45 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Если цель - защититься от преднамеренного дублирования имени мютекса, то - защититься нельзя. Если от случайного - то в качестве имени мютекса используйте полный путь до вашего ЕХЕ. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 19:50 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
AISЧто тут сложного? Но вот если имя запускающего файла искажено (неважно даже у 1-го либо 2-го экземпляра), то второй экземпляр не запустится. И если это будет один из элементов защиты, то "кашу маслом не испортишь". :) В качестве имени мьютекса можно использовать предварительно сгенерированный GUID с приделанным к нему номером версии программы, например. И что даст такая проверка по MD5? Это защита от чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 21:39 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Локшин Марк...Это защита от чего? Это защита (если Вам так угодно) от запуска 2-го экземпляра программы. Хотя мне казалось, что это просто поведение программы при желании пользователя запустить программу, когда он "забыл" что она уже запущена, либо он делает подряд два клика по иконке вместо одного. Задача не стоит в фиксации одного рабочего места по лицензии, хотя этот вопрос тоже интересен, а в исключении вариантов когда программа отрабатывает такую ситуацию с ошибкой. Локшин Марк...И что даст такая проверка по MD5? То что - независимо от того как переименовали запускающий файл и где бы он не дублировался вместе с каталогом программы, то новый запущенный экземпляр программы сможет его определить, вывести на передний план 1-ый экземпляр и потом себя закрыть. А MD5 потому, что в паре с тестом на стандартное имя ЕХЕ-файла, дает возможность (кроме изложенного выше) ещё легко отфильтровать ПО у которых по иронии судьбы вдруг оказалось такое же имя запускающегося файла. Локшин МаркВ качестве имени мьютекса можно использовать предварительно сгенерированный GUID с приделанным к нему номером версии программы, например. Вы хотите сказать, что Ваш вариант сработает в случаях смоделированных выше? Сомневаюсь ;) Куда GUID вшивать то, либо где хранить? (я так понимаю, что это будет константа в приложении) Как это стыкуется с тем, что GUID уникален для данного ПК в данный момент. Если его перегенерировать на том же ПК, то он будет другим. И он будет другим и на других ПК. А вот MD5-файла везде одинаков и так же теоритически не имеет коллизий. Либо пояснит на примере как воспользоваться GUID и Mutex? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 23:14 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
А почему не подходит старый, проверенный - способ ? Я, правда, слегка его изменил - добавил время и дату создания приложения Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 09:59 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
AISЛибо пояснит на примере как воспользоваться GUID и Mutex? Сгенерировать GUID любыми средствами, присвоить его константе в программе и использовать его в качестве имени мьютекса. Уникальность сгенерированного GUID'а как-бы гарантируется в пределах всех компьютеров на планете с достаточно большой вероятностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 11:00 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
ChVА почему не подходит старый, проверенный - способ ? Подходит. Ранее аналогичным "старым" вариантом и пользовался. А сейчас появились дополнительные задачи, о которых я говорил в начале. ChVЯ, правда, слегка его изменил - добавил время и дату создания приложения А вот здесь я никак не могу понять, как это будет работать при наличии "даты" и "времени"? (даже не в рамках моего вопроса) GetLastError выдаст соответствующую ошибку если Mutex-1 и Mutex-2 совпадут, а они при таком варианте совпасть смогут крайне редко. И 2-ое приложение практически всегда должно отвечать: нет Mutex с таким же ключем как у меня, я - 1-ый экземпляр, путь открыт. Или я чего то не допонимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 11:03 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
AISИли я чего то не допонимаю? Конечно. Константа с датой и временем будет вычисленна один раз на момент компиляции программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 11:10 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Локшин МаркКонечно. Константа с датой и временем будет вычисленна один раз на момент компиляции программы. Да, Вы опять правы. :) Не обратил внимание когда переменной задается значение. :( Локшин МаркAISЛибо пояснит на примере как воспользоваться GUID и Mutex? Сгенерировать GUID любыми средствами, присвоить его константе в программе и использовать его в качестве имени мьютекса. Уникальность сгенерированного GUID'а как-бы гарантируется в пределах всех компьютеров на планете с достаточно большой вероятностью. Согласен. Если сгенерировать "чистый" GUID (без доп. привязок, хотя это будет тот же отформатированный MD5) зашивать как константу и держать её неизменной во всех версиях своего ПО, то можно ограничить запуск даже при различии версий экземпляров одного и того же ПО. Это +. Но как было замечено ранее: "ничто не мешает изменить данную константу", и как следствие иметь возможность запускать и 2-ой экземпляр. Уже понимаю, что и мои потуги с MD5(от ЕХЕ-файла) будут страдать тем же. Спасибо всем за комментарии и советы. Беру таймаут, буду дальше "изобретать велосипед". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 11:40 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Еще один деревянный способ видел у одного товарища: Идея такая при запуске программы создает файл в монопольном режиме и оставляет его открытым. При запуске второго экземпляра если файл существует и не удается его удалить, открыть, значит первый экземпляр программы запущен и работает, второй экземпляр завершает. При завершении первого экземпляра программы закрывает открытый файл. Конечно наивный способ, но у него работает. Пока процесс работает файл недоступен для других процессов. Лично я использовал поиск по памяти на наличии запущенных процессов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2011, 17:01 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
osxlЕще один деревянный способ видел у одного товарища: ... При завершении первого экземпляра программы закрывает открытый файл...Способ, конечно, не плохой и имет право на существование и использование, но есть у него нехорошая особеность: при GPF программы файл может "остаться" открытым и недоступным до перезапуска ОС или до перелогона пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2011, 22:35 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Ikarпри GPF программы файл может "остаться" открытым и недоступным до перезапуска ОС или до перелогона пользователя. Не верю. Думаю что вы неверно интерпретировали ситуацию, когда программа после закрытия последнего окна висела в памяти без открытых окон (а это у PB - раз плюнуть ). Кроме того мютекс, с точки зрения Винды, это такой же файловый хендл, и точно также мог бы "остаться" открытым после GPF, если бы такая ситуация была возможной. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 19:26 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, На счет " неверно интерпретировали ситуацию, когда программа после закрытия последнего окна висела в памяти без открытых окон " - обидеть хотите, или пошутили? Ну, подтавердить примером не могу, конечно, но в одном из приложений на РВ писаных (не мной) наблюдаю у пользователей такую ситуацию периодически. Приложеньице как раз с файлом работает - создает, пишет в него, потом закрывает, если не падает. А если таки падает (что бывает весьма часто), то пользователю приходится перелогиниваться в ХР, т.к. файл остается "занятым" и не может ни переоткрыться, ни удалиться. На счет того, что это тот же мьютекс для винды - полностью согласен. Кстати, из иных, не РВ-шных приложений, помнится, не именно такой, но очень похожей ситуацией у меня грешил The Bat! одной и старых версий, только не с файлом, а с папкой: при сохранении письма в какую либо папку по "длинному" пути (C:\Documents and Settings\...) он иногда GPF-ился и после этого папка становилась "занятой" - т.е. ее было нельзя ни удалить, ни переименовать, ни переместить, ни внутри нее с файлами и папками что-то сделсать. Лечилось так-же: либо перелогоном, либо ребутом. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 22:40 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Раз частая ситуация, то в след. раз, когда произойдет, попробуйте плз этой программкой определить какой процесс держит файл открытым. Интересно посмотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2011, 00:16 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Ikarно в одном из приложений на РВ писаных (не мной) наблюдаю у пользователей такую ситуацию периодически. Приложеньице как раз с файлом работает - создает, пишет в него, потом закрывает, если не падает. А если таки падает (что бывает весьма часто), то пользователю приходится перелогиниваться в ХР, т.к. файл остается "занятым" и не может ни переоткрыться, ни удалиться.У меня с точностью до наоборот(приложение написано не мной), даже если приложение падает, файл освобождается. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2011, 11:37 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
Почитал вышесказанное про "падение" программ и решил здесь задать ещё вопросик. В программе на каком-то этапе создается поток и там что-то вычисляется. Если программа падает до конца вычисления, то поток остается. И если пользователь перезапускает ПО, то мютекс отвечает, что ПО уже запущено и дает отбой. Поток можно удалить, либо перезапустить ПК, но это не хорошо. Как можно программно выйти из положения в таком случае? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2011, 20:10 |
|
Запуск дубликата ПО
|
|||
---|---|---|---|
#18+
AISПочитал вышесказанное про "падение" программ и решил здесь задать ещё вопросик. В программе на каком-то этапе создается поток и там что-то вычисляется. Если программа падает до конца вычисления, то поток остается. И если пользователь перезапускает ПО, то мютекс отвечает, что ПО уже запущено и дает отбой. Поток можно удалить, либо перезапустить ПК, но это не хорошо. Как можно программно выйти из положения в таком случае? Я смотрю, вас уже двое, видевших чудо :) Ребята, то что вы описываете (неосвобождение ресурсов после краша), если бы оно существовало, означало бы существенный баг в Винде, который давно бы обнаружили и исправили. Может кто-то из вас привести пример программы которая крашится и при этом файл или мютекс не закрывается (и тем более поток)? Свою очередь привожу программу (исходники на C + собранная программа в папке Release) которая открывает файл и крашится, и при этом файл освобождается, как и должно быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2011, 21:32 |
|
|
start [/forum/topic.php?fid=15&fpage=20&tid=1335718]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 279ms |
total: | 425ms |
0 / 0 |