Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Тема старая и неплохо изложенная здесь, но возникли такие вопросы:
- Как определить, что запущено моё приложение, а не "однофамилец"?
(т.е. "вдруг" у чужого ПО есть такой же заголовок у окошка, либо ПО имеет одноименный запускающий файл)

- Как определить, что уже запущен экземпляр моего ПО, но не из оригинального, а переименованного запускающего файла?
(т.е. пользователь изменил "myapp.exe" на "myapp_2.exe" и может запускать одновременно два и т.д. экземпляров ПО)
27 апр 11, 09:24    [10571938]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
roleks
Member

Откуда:
Сообщений: 243
1. придумайте заголовок приложения уникальный. например app v.1.0 build 111 01.01.2011
2. так при запуске приложения проверяйте как назівается его ехе
27 апр 11, 09:32    [10571963]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318

27.04.2011 10:24, AIS пишет:

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

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

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

Mutex.

Posted via ActualForum NNTP Server 1.4

27 апр 11, 10:13    [10572157]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
roleks
...
2. так при запуске приложения проверяйте как назівается его ехе

Вот я и говорю: Проверил... Такого как "myapp.exe" нет, а по факту есть "myapp_2.exe", которое не определяется, т.к. имя другое, которого я знать не могу. И получается, что два (в частности, а может и более) ПО работают одновременно.

Dim2000
...Mutex

Да, это решение, им и пользовался, но т.к. появились вопросы, то заинтересовал вариант - пробежаться по процессам и определить *.ехе файл, у которого совпадает (например) MD5 файла с оригиналом. И таким образом определить то ли это приложение, либо нет.
Может это лучше и надежней?
Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла.
27 апр 11, 12:13    [10573134]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
Может это лучше и надежней?
Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла.

А чем это лучше и надежней?
27 апр 11, 15:16    [10574935]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк
AIS
Может это лучше и надежней?
Тем более, что нет привязки к уникальности и заголовкам окон, и к имени запускающего файла, а за одно и тест на модификацию файла.

А чем это лучше и надежней?

Может быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО.
27 апр 11, 15:46    [10575215]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Правда к "оконным" функциям всё равно пришлось обратится (другого способа не нашел), чтобы сделать restore и вывести 1-ый экземпляр ПО на передний план. Но это уже потом, после успешного теста на "дубликат".
27 апр 11, 15:54    [10575280]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
Может быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО.

Чем это лучше, чем мьютекс?
А дополнительная возможность проверки ПО - в качестве защиты это легко ломается, зато при каждой перекомпиляции программы вставлять в нее нужную сумму - будет дополнительное веселье.
27 апр 11, 15:54    [10575283]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк
AIS
Может быть тем, что (как мне кажется) здесь отсутствуют проблемы, которые возникают при применении "оконных" функций, и + появляются дополнительные возможности проверки ПО.

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

А придумывать для Mutex уникальное значение - это надёжно? И делать это для "каждой перекомпиляции программы"?

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

Да и какое "веселье" с компиляцией? Программа может использовать банальный алгоритм:
/*тест имени ЕХЕ-файла, которое как правило создается на основе AppName*/
if ls_EXE_name <> ls_AppName then RETURN FALSE
/*OK, т.е. у экземпляра который сейчас запускается, имя не искажено*/
/*на его основе создаем оригинальный ключ для теста*/
ls_key = string( MD5( blob ЕХЕ-файла))
/*далее пробегаем по *.ехе и сравниваем с оригиналом ключа*/
Что тут сложного?
Но вот если имя запускающего файла искажено (неважно даже у 1-го либо 2-го экземпляра), то второй экземпляр не запустится.
И если это будет один из элементов защиты, то "кашу маслом не испортишь". :)
27 апр 11, 16:45    [10575671]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Если цель - защититься от преднамеренного дублирования имени мютекса, то - защититься нельзя.
Если от случайного - то в качестве имени мютекса используйте полный путь до вашего ЕХЕ.
27 апр 11, 19:50    [10576872]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
Что тут сложного?
Но вот если имя запускающего файла искажено (неважно даже у 1-го либо 2-го экземпляра), то второй экземпляр не запустится.
И если это будет один из элементов защиты, то "кашу маслом не испортишь". :)

В качестве имени мьютекса можно использовать предварительно сгенерированный GUID с приделанным к нему номером версии программы, например. И что даст такая проверка по MD5? Это защита от чего?
27 апр 11, 21:39    [10577274]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк
...Это защита от чего?

Это защита (если Вам так угодно) от запуска 2-го экземпляра программы. Хотя мне казалось, что это просто поведение программы при желании пользователя запустить программу, когда он "забыл" что она уже запущена, либо он делает подряд два клика по иконке вместо одного.
Задача не стоит в фиксации одного рабочего места по лицензии, хотя этот вопрос тоже интересен, а в исключении вариантов когда программа отрабатывает такую ситуацию с ошибкой.
Локшин Марк
...И что даст такая проверка по MD5?

То что - независимо от того как переименовали запускающий файл и где бы он не дублировался вместе с каталогом программы, то новый запущенный экземпляр программы сможет его определить, вывести на передний план 1-ый экземпляр и потом себя закрыть.
А MD5 потому, что в паре с тестом на стандартное имя ЕХЕ-файла, дает возможность (кроме изложенного выше) ещё легко отфильтровать ПО у которых по иронии судьбы вдруг оказалось такое же имя запускающегося файла.

Локшин Марк
В качестве имени мьютекса можно использовать предварительно сгенерированный GUID с приделанным к нему номером версии программы, например.

Вы хотите сказать, что Ваш вариант сработает в случаях смоделированных выше? Сомневаюсь ;)
Куда GUID вшивать то, либо где хранить? (я так понимаю, что это будет константа в приложении)
Как это стыкуется с тем, что GUID уникален для данного ПК в данный момент. Если его перегенерировать на том же ПК, то он будет другим. И он будет другим и на других ПК. А вот MD5-файла везде одинаков и так же теоритически не имеет коллизий.
Либо пояснит на примере как воспользоваться GUID и Mutex?
27 апр 11, 23:14    [10577608]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
ChV
Member

Откуда: Москва
Сообщений: 271
А почему не подходит старый, проверенный - способ ?
Я, правда, слегка его изменил - добавил время и дату создания приложения
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 !
28 апр 11, 09:59    [10578422]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
Либо пояснит на примере как воспользоваться GUID и Mutex?

Сгенерировать GUID любыми средствами, присвоить его константе в программе и использовать его в качестве имени мьютекса. Уникальность сгенерированного GUID'а как-бы гарантируется в пределах всех компьютеров на планете с достаточно большой вероятностью.
28 апр 11, 11:00    [10578789]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
ChV
А почему не подходит старый, проверенный - способ ?

Подходит. Ранее аналогичным "старым" вариантом и пользовался. А сейчас появились дополнительные задачи, о которых я говорил в начале.
ChV
Я, правда, слегка его изменил - добавил время и дату создания приложения

А вот здесь я никак не могу понять, как это будет работать при наличии "даты" и "времени"? (даже не в рамках моего вопроса)
GetLastError выдаст соответствующую ошибку если Mutex-1 и Mutex-2 совпадут, а они при таком варианте совпасть смогут крайне редко. И 2-ое приложение практически всегда должно отвечать: нет Mutex с таким же ключем как у меня, я - 1-ый экземпляр, путь открыт.
Или я чего то не допонимаю?
28 апр 11, 11:03    [10578812]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
Или я чего то не допонимаю?

Конечно. Константа с датой и временем будет вычисленна один раз на момент компиляции программы.
28 апр 11, 11:10    [10578868]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк
Конечно. Константа с датой и временем будет вычисленна один раз на момент компиляции программы.

Да, Вы опять правы. :)
Не обратил внимание когда переменной задается значение. :(

Локшин Марк
AIS
Либо пояснит на примере как воспользоваться GUID и Mutex?

Сгенерировать GUID любыми средствами, присвоить его константе в программе и использовать его в качестве имени мьютекса. Уникальность сгенерированного GUID'а как-бы гарантируется в пределах всех компьютеров на планете с достаточно большой вероятностью.

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

Спасибо всем за комментарии и советы. Беру таймаут, буду дальше "изобретать велосипед". Картинка с другого сайта.
28 апр 11, 11:40    [10579134]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
osxl
Member

Откуда:
Сообщений: 96
Еще один деревянный способ видел у одного товарища:

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

Конечно наивный способ, но у него работает. Пока процесс работает файл недоступен для других процессов. Лично я использовал поиск по памяти на наличии запущенных процессов.
24 май 11, 17:01    [10701558]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Ikar
Member

Откуда: Москва
Сообщений: 928
osxl
Еще один деревянный способ видел у одного товарища:
... При завершении первого экземпляра программы закрывает открытый файл...
Способ, конечно, не плохой и имет право на существование и использование, но есть у него нехорошая особеность: при GPF программы файл может "остаться" открытым и недоступным до перезапуска ОС или до перелогона пользователя.
24 май 11, 22:35    [10703084]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Ikar
при GPF программы файл может "остаться" открытым и недоступным до перезапуска ОС или до перелогона пользователя.

Не верю.
Думаю что вы неверно интерпретировали ситуацию, когда программа после закрытия последнего окна висела в памяти без открытых окон (а это у PB - раз плюнуть ).

Кроме того мютекс, с точки зрения Винды, это такой же файловый хендл, и точно также мог бы "остаться" открытым после GPF, если бы такая ситуация была возможной.
25 май 11, 19:26    [10709211]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Ikar
Member

Откуда: Москва
Сообщений: 928
Anatoly Moskovsky,

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

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

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

Кстати, из иных, не РВ-шных приложений, помнится, не именно такой, но очень похожей ситуацией у меня грешил The Bat! одной и старых версий, только не с файлом, а с папкой: при сохранении письма в какую либо папку по "длинному" пути (C:\Documents and Settings\...) он иногда GPF-ился и после этого папка становилась "занятой" - т.е. ее было нельзя ни удалить, ни переименовать, ни переместить, ни внутри нее с файлами и папками что-то сделсать. Лечилось так-же: либо перелогоном, либо ребутом.
25 май 11, 22:40    [10709802]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Раз частая ситуация, то в след. раз, когда произойдет, попробуйте плз этой программкой определить какой процесс держит файл открытым.
Интересно посмотреть.
26 май 11, 00:16    [10710168]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
osxl
Member

Откуда:
Сообщений: 96
Ikar
но в одном из приложений на РВ писаных (не мной) наблюдаю у пользователей такую ситуацию периодически. Приложеньице как раз с файлом работает - создает, пишет в него, потом закрывает, если не падает. А если таки падает (что бывает весьма часто), то пользователю приходится перелогиниваться в ХР, т.к. файл остается "занятым" и не может ни переоткрыться, ни удалиться.
У меня с точностью до наоборот(приложение написано не мной), даже если приложение падает, файл освобождается.
26 май 11, 11:37    [10711731]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
AIS
Member

Откуда:
Сообщений: 1695
Почитал вышесказанное про "падение" программ и решил здесь задать ещё вопросик.

В программе на каком-то этапе создается поток и там что-то вычисляется. Если программа падает до конца вычисления, то поток остается. И если пользователь перезапускает ПО, то мютекс отвечает, что ПО уже запущено и дает отбой. Поток можно удалить, либо перезапустить ПК, но это не хорошо.
Как можно программно выйти из положения в таком случае?
26 май 11, 20:10    [10715909]     Ответить | Цитировать Сообщить модератору
 Re: Запуск дубликата ПО  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
AIS
Почитал вышесказанное про "падение" программ и решил здесь задать ещё вопросик.

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


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

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

Свою очередь привожу программу (исходники на C + собранная программа в папке Release) которая открывает файл и крашится, и при этом файл освобождается, как и должно быть.

К сообщению приложен файл (crash_test.zip - 7Kb) cкачать
26 май 11, 21:32    [10716062]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / PowerBuilder Ответить