powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Запуск дубликата ПО
25 сообщений из 28, страница 1 из 2
Запуск дубликата ПО
    #37235142
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема старая и неплохо изложенная здесь , но возникли такие вопросы:
- Как определить, что запущено моё приложение, а не "однофамилец"?
(т.е. "вдруг" у чужого ПО есть такой же заголовок у окошка, либо ПО имеет одноименный запускающий файл)

- Как определить, что уже запущен экземпляр моего ПО, но не из оригинального, а переименованного запускающего файла?
(т.е. пользователь изменил "myapp.exe" на "myapp_2.exe" и может запускать одновременно два и т.д. экземпляров ПО)
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37235153
roleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. придумайте заголовок приложения уникальный. например app v.1.0 build 111 01.01.2011
2. так при запуске приложения проверяйте как назівается его ехе
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37235231
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.04.2011 10:24, AIS пишет:

> Тема старая и неплохо изложенная здесь
> < http://www.rsdn.ru/article/baseserv/avins.xml>, но возникли такие вопросы:

Вопросов возникать не должно, ибо на них были даны ответы ;).

> - Как определить, что запущено моё приложение, а не "однофамилец"?
> - Как определить, что уже запущен экземпляр моего ПО, но не из
> оригинального, а переименованного запускающего файла?

Mutex.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37235487
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roleks...
2. так при запуске приложения проверяйте как назівается его ехе
Вот я и говорю: Проверил... Такого как "myapp.exe" нет, а по факту есть "myapp_2.exe", которое не определяется, т.к. имя другое, которого я знать не могу. И получается, что два (в частности, а может и более) ПО работают одновременно.

Dim2000...Mutex
Да, это решение, им и пользовался, но т.к. появились вопросы, то заинтересовал вариант - пробежаться по процессам и определить *.ехе файл, у которого совпадает (например) MD5 файла с оригиналом. И таким образом определить то ли это приложение, либо нет.
Может это лучше и надежней?
Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236099
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISМожет это лучше и надежней?
Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла.
А чем это лучше и надежней?
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236204
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркAISМожет это лучше и надежней?
Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла.
А чем это лучше и надежней?
Может быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236221
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда к "оконным" функциям всё равно пришлось обратится (другого способа не нашел), чтобы сделать restore и вывести 1-ый экземпляр ПО на передний план. Но это уже потом, после успешного теста на "дубликат".
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236222
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISМожет быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО.
Чем это лучше, чем мьютекс?
А дополнительная возможность проверки ПО - в качестве защиты это легко ломается, зато при каждой перекомпиляции программы вставлять в нее нужную сумму - будет дополнительное веселье.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236391
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркAISМожет быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО.
Чем это лучше, чем мьютекс?
А дополнительная возможность проверки ПО - в качестве защиты это легко ломается, зато при каждой перекомпиляции программы вставлять в нее нужную сумму - будет дополнительное веселье.
А придумывать для Mutex уникальное значение - это надёжно? И делать это для "каждой перекомпиляции программы"?

А вообще, мысли были не о защите, а четком срабатывании ПО на "дубликат", чтобы не было "ложных" срабатываний.

Да и какое "веселье" с компиляцией? Программа может использовать банальный алгоритм:
Код: plaintext
1.
2.
3.
4.
5.
/*тест имени ЕХЕ-файла, которое как правило создается на основе AppName*/
if ls_EXE_name <> ls_AppName then RETURN FALSE
/*OK, т.е. у экземпляра который сейчас запускается, имя не искажено*/
/*на его основе создаем оригинальный ключ для теста*/
ls_key = string( MD5( blob ЕХЕ-файла))
/*далее пробегаем по *.ехе и сравниваем с оригиналом ключа*/
Что тут сложного?
Но вот если имя запускающего файла искажено (неважно даже у 1-го либо 2-го экземпляра), то второй экземпляр не запустится.
И если это будет один из элементов защиты, то "кашу маслом не испортишь". :)
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236769
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если цель - защититься от преднамеренного дублирования имени мютекса, то - защититься нельзя.
Если от случайного - то в качестве имени мютекса используйте полный путь до вашего ЕХЕ.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236879
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISЧто тут сложного?
Но вот если имя запускающего файла искажено (неважно даже у 1-го либо 2-го экземпляра), то второй экземпляр не запустится.
И если это будет один из элементов защиты, то "кашу маслом не испортишь". :)
В качестве имени мьютекса можно использовать предварительно сгенерированный GUID с приделанным к нему номером версии программы, например. И что даст такая проверка по MD5? Это защита от чего?
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37236968
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк...Это защита от чего?
Это защита (если Вам так угодно) от запуска 2-го экземпляра программы. Хотя мне казалось, что это просто поведение программы при желании пользователя запустить программу, когда он "забыл" что она уже запущена, либо он делает подряд два клика по иконке вместо одного.
Задача не стоит в фиксации одного рабочего места по лицензии, хотя этот вопрос тоже интересен, а в исключении вариантов когда программа отрабатывает такую ситуацию с ошибкой.
Локшин Марк...И что даст такая проверка по MD5?
То что - независимо от того как переименовали запускающий файл и где бы он не дублировался вместе с каталогом программы, то новый запущенный экземпляр программы сможет его определить, вывести на передний план 1-ый экземпляр и потом себя закрыть.
А MD5 потому, что в паре с тестом на стандартное имя ЕХЕ-файла, дает возможность (кроме изложенного выше) ещё легко отфильтровать ПО у которых по иронии судьбы вдруг оказалось такое же имя запускающегося файла.

Локшин МаркВ качестве имени мьютекса можно использовать предварительно сгенерированный GUID с приделанным к нему номером версии программы, например.
Вы хотите сказать, что Ваш вариант сработает в случаях смоделированных выше? Сомневаюсь ;)
Куда GUID вшивать то, либо где хранить? (я так понимаю, что это будет константа в приложении)
Как это стыкуется с тем, что GUID уникален для данного ПК в данный момент. Если его перегенерировать на том же ПК, то он будет другим. И он будет другим и на других ПК. А вот MD5-файла везде одинаков и так же теоритически не имеет коллизий.
Либо пояснит на примере как воспользоваться GUID и Mutex?
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37237323
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему не подходит старый, проверенный - способ ?
Я, правда, слегка его изменил - добавил время и дату создания приложения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
FUNCTION ulong CreateMutexA(ulong lpMutexAttributes, boolean bInitialOwner, REF string lpszName)  LIBRARY "kernel32.dll"
FUNCTION long GetLastError() LIBRARY "kernel32.dll"

public function boolean uf_appl_exist ();  constant ulong ERROR_ALREADY_EXISTS =  183 
  constant ulong SUCCESSFUL_EXECUTION =  0 
  ulong lul_mutex
  ulong lpsa
  ulong lul_last_error
  boolean lb_ret = FALSE
  String as_appname = 'Client ' + String( Today(),'ddmmyyyy' ) + String(Now(),'hhmmss')

  IF NOT (Handle(GetApplication()) =  0 ) THEN
     lul_mutex = CreateMutexA(lpsa, FALSE, as_appname)
     lul_last_error = GetLastError()
     lb_ret = NOT (lul_last_error = SUCCESSFUL_EXECUTION)
  END IF

  RETURN lb_ret

end function


Good Luck !
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37237489
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISЛибо пояснит на примере как воспользоваться GUID и Mutex?
Сгенерировать GUID любыми средствами, присвоить его константе в программе и использовать его в качестве имени мьютекса. Уникальность сгенерированного GUID'а как-бы гарантируется в пределах всех компьютеров на планете с достаточно большой вероятностью.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37237502
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChVА почему не подходит старый, проверенный - способ ?
Подходит. Ранее аналогичным "старым" вариантом и пользовался. А сейчас появились дополнительные задачи, о которых я говорил в начале.
ChVЯ, правда, слегка его изменил - добавил время и дату создания приложения
А вот здесь я никак не могу понять, как это будет работать при наличии "даты" и "времени"? (даже не в рамках моего вопроса)
GetLastError выдаст соответствующую ошибку если Mutex-1 и Mutex-2 совпадут, а они при таком варианте совпасть смогут крайне редко. И 2-ое приложение практически всегда должно отвечать: нет Mutex с таким же ключем как у меня, я - 1-ый экземпляр, путь открыт.
Или я чего то не допонимаю?
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37237530
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISИли я чего то не допонимаю?
Конечно. Константа с датой и временем будет вычисленна один раз на момент компиляции программы.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37237624
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркКонечно. Константа с датой и временем будет вычисленна один раз на момент компиляции программы.
Да, Вы опять правы. :)
Не обратил внимание когда переменной задается значение. :(

Локшин МаркAISЛибо пояснит на примере как воспользоваться GUID и Mutex?
Сгенерировать GUID любыми средствами, присвоить его константе в программе и использовать его в качестве имени мьютекса. Уникальность сгенерированного GUID'а как-бы гарантируется в пределах всех компьютеров на планете с достаточно большой вероятностью.
Согласен. Если сгенерировать "чистый" GUID (без доп. привязок, хотя это будет тот же отформатированный MD5) зашивать как константу и держать её неизменной во всех версиях своего ПО, то можно ограничить запуск даже при различии версий экземпляров одного и того же ПО. Это +.
Но как было замечено ранее: "ничто не мешает изменить данную константу", и как следствие иметь возможность запускать и 2-ой экземпляр.
Уже понимаю, что и мои потуги с MD5(от ЕХЕ-файла) будут страдать тем же.

Спасибо всем за комментарии и советы. Беру таймаут, буду дальше "изобретать велосипед".
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37277099
osxl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один деревянный способ видел у одного товарища:

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

Конечно наивный способ, но у него работает. Пока процесс работает файл недоступен для других процессов. Лично я использовал поиск по памяти на наличии запущенных процессов.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37277555
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osxlЕще один деревянный способ видел у одного товарища:
... При завершении первого экземпляра программы закрывает открытый файл...Способ, конечно, не плохой и имет право на существование и использование, но есть у него нехорошая особеность: при GPF программы файл может "остаться" открытым и недоступным до перезапуска ОС или до перелогона пользователя.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37279237
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ikarпри GPF программы файл может "остаться" открытым и недоступным до перезапуска ОС или до перелогона пользователя.
Не верю.
Думаю что вы неверно интерпретировали ситуацию, когда программа после закрытия последнего окна висела в памяти без открытых окон (а это у PB - раз плюнуть ).

Кроме того мютекс, с точки зрения Винды, это такой же файловый хендл, и точно также мог бы "остаться" открытым после GPF, если бы такая ситуация была возможной.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37279471
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

На счет " неверно интерпретировали ситуацию, когда программа после закрытия последнего окна висела в памяти без открытых окон " - обидеть хотите, или пошутили?

Ну, подтавердить примером не могу, конечно, но в одном из приложений на РВ писаных (не мной) наблюдаю у пользователей такую ситуацию периодически. Приложеньице как раз с файлом работает - создает, пишет в него, потом закрывает, если не падает. А если таки падает (что бывает весьма часто), то пользователю приходится перелогиниваться в ХР, т.к. файл остается "занятым" и не может ни переоткрыться, ни удалиться.

На счет того, что это тот же мьютекс для винды - полностью согласен.

Кстати, из иных, не РВ-шных приложений, помнится, не именно такой, но очень похожей ситуацией у меня грешил The Bat! одной и старых версий, только не с файлом, а с папкой: при сохранении письма в какую либо папку по "длинному" пути (C:\Documents and Settings\...) он иногда GPF-ился и после этого папка становилась "занятой" - т.е. ее было нельзя ни удалить, ни переименовать, ни переместить, ни внутри нее с файлами и папками что-то сделсать. Лечилось так-же: либо перелогоном, либо ребутом.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37279582
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз частая ситуация, то в след. раз, когда произойдет, попробуйте плз этой программкой определить какой процесс держит файл открытым.
Интересно посмотреть.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37280092
osxl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ikarно в одном из приложений на РВ писаных (не мной) наблюдаю у пользователей такую ситуацию периодически. Приложеньице как раз с файлом работает - создает, пишет в него, потом закрывает, если не падает. А если таки падает (что бывает весьма часто), то пользователю приходится перелогиниваться в ХР, т.к. файл остается "занятым" и не может ни переоткрыться, ни удалиться.У меня с точностью до наоборот(приложение написано не мной), даже если приложение падает, файл освобождается.
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37281403
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал вышесказанное про "падение" программ и решил здесь задать ещё вопросик.

В программе на каком-то этапе создается поток и там что-то вычисляется. Если программа падает до конца вычисления, то поток остается. И если пользователь перезапускает ПО, то мютекс отвечает, что ПО уже запущено и дает отбой. Поток можно удалить, либо перезапустить ПК, но это не хорошо.
Как можно программно выйти из положения в таком случае?
...
Рейтинг: 0 / 0
Запуск дубликата ПО
    #37281464
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISПочитал вышесказанное про "падение" программ и решил здесь задать ещё вопросик.

В программе на каком-то этапе создается поток и там что-то вычисляется. Если программа падает до конца вычисления, то поток остается. И если пользователь перезапускает ПО, то мютекс отвечает, что ПО уже запущено и дает отбой. Поток можно удалить, либо перезапустить ПК, но это не хорошо.
Как можно программно выйти из положения в таком случае?

Я смотрю, вас уже двое, видевших чудо :)

Ребята, то что вы описываете (неосвобождение ресурсов после краша), если бы оно существовало, означало бы существенный баг в Винде, который давно бы обнаружили и исправили.
Может кто-то из вас привести пример программы которая крашится и при этом файл или мютекс не закрывается (и тем более поток)?

Свою очередь привожу программу (исходники на C + собранная программа в папке Release) которая открывает файл и крашится, и при этом файл освобождается, как и должно быть.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Запуск дубликата ПО
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]