Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 4 5 вперед Ctrl→ все |
mayton Member Откуда: loopback Сообщений: 51019 |
Привет друзья. Как дела? Какие пятничные темы вы хотели-бы услышать? (Пятничные темы - любые технологичные. По программированию. Но не срочные. Не продуктовы баги вобщем.) |
19 мар 21, 20:46 [22297515] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
Весенние каникулы у детей начинаются. Зефирки учимся жарить на мангале. |
19 мар 21, 22:17 [22297536] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
mayton, интересует запрет повторного запуска проги той же папки. Из другой можно. Главный вопрос - активировать прогу уже запущенную из этой папки. |
19 мар 21, 22:20 [22297537] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51019 |
Создавай в текущей папке .pid файл с кодом текущего процесса. Да это горбуха. Сообщение было отредактировано: 22 мар 21, 12:11 |
19 мар 21, 22:26 [22297538] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51019 |
Разве зефирки жарят? Обычно - сосиски. |
||||
19 мар 21, 22:28 [22297539] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
А если прога крашнеца и не уберет за собой .pid? |
||||
19 мар 21, 22:28 [22297540] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
Кстати да. Никогда не понимал этого буржуйского извращения. Или у них зефир другой? |
||||||||
19 мар 21, 22:29 [22297541] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Ну… Создать именованный мьютекс (уровня системы). Имя мьютекса должно содержать папку запуска. При этом мьютекс нужно захватить при запуске и никогда не нужно отпускать. А вот переключиться на уже запущенное приложение... |
||||
19 мар 21, 22:35 [22297546] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
Жарят. Все горячее вкуснее чем холодное. Фотки дал бы, но с телефона пишу, не дома, комп дети отжали ((( |
||||||||
19 мар 21, 22:35 [22297547] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Если крашнеца... При старте прога должна взять эксклюзивные права на доступ к этому файлу. Если твоя прога крашается, то все ограничения доступа слетают. Как и тот заблокированный мьютекс. |
||||||||
19 мар 21, 22:38 [22297548] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
С мьютексом понятно, не понятно причем тут .pid. А как активировать уже запущенную прогу по мьютексу?? И да. В винде. |
||||||||
19 мар 21, 22:41 [22297550] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
"Активировать" это что значит в реальной жизни? Сообщение было отредактировано: 19 мар 21, 22:47 |
||||||||
19 мар 21, 22:47 [22297552] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Я не знаю, что это такой за файл .pid. Видимо, что это файл содержащий process id. Имея process id возможно можно определить дескриптор главного окна этого процесса и послать ему что-то типа сообщения WM_SHOW. Кстати, Process Explorer умеет определять какой процесс держит файл. Так что в файл записывать process id, видимо, не нужно.
Я не знаю. |
||||||||||||
19 мар 21, 22:48 [22297553] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Вот только что я запустил программу, которая держит определённый файл. Потом я запустил Process Explorer. Главное меню: Find -> Find handle or DLL. По имени файла нашёлся процесс, который держит этот файл. Дальше ПКМ на этом процессе: Window -> Bring to front. Всё, приложение активировано на основе пути к файлу, который (файл) держит это приложение. Как блокировку файла заменить на блокировку глобального мьютекса... Ну... может можно. |
19 мар 21, 22:57 [22297557] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
Чтоб запущенная прога развернулась с панели задач. Впрочем, вопрос только в том, как во второй копии получить хендл окна уже запущеной проги из этой же папки. |
||||
19 мар 21, 22:57 [22297558] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
How to get main window handle from process id?. Поиск в гугле по: winapi get main window handle for process id. |
||||||||
19 мар 21, 23:04 [22297560] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
Тогда вопрос в том, как во второй копии получить process id уже запущеной проги из этой же папки. |
||||||||
19 мар 21, 23:07 [22297561] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Уже всё же сказано. - В .pid файл записать process id. Но на случай падения приложения нужно держать эксклюзивные права на запись в этот файл. - Можно держать эксклюзивные права вообще на пустой файл в папке приложения. И по пути к этому файлу определить process id — process explorer так может. - Можно попробовать по имени мьютекса (который содержит путь к папке) определить process id, который его держит. Тут есть ещё момент, что на компе может быть авторизовано сразу несколько пользователей. WinAPI неисчерпаем так же как и атом. Это ещё В.И. Ленин говорил. |
||||||||
19 мар 21, 23:17 [22297565] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
у меня есть ini файл. Наверно можно его заюзать под это дело. И писать в него pid при запуске. Т.е. при запуске проги, мы проверяем, есть ли возможность в него писать, если нет, то берем оттуда pid, активируем запущенный экземпляр и закрываемся. И никакие мьютексы не нужны. Осталось узнать про эксклюзивные права записи. Как ставить и как проверять. Сообщение было отредактировано: 19 мар 21, 23:22 |
19 мар 21, 23:28 [22297566] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
При запуске проги пытаемся заблокировать файл на эксклюзивную запись. Если получилось, то записываем в ini файл pid и запускаемся. Если не получилось, то пытаемся открыть этот файл на чтение и читаем pid. Если получилось, читаем pid. По нему получаем HWND и активируем окно. Выходим. Эксклюзивные права на запись, например, проверяются попыткой получить такие права. Получил - значит ты хозяин. Документация на функцию ::CreateFile() из WinAPI. |
||||
19 мар 21, 23:36 [22297570] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
о, а может сразу HWND в ини пихать? |
19 мар 21, 23:38 [22297571] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Не знаю. ![]() |
||||
19 мар 21, 23:48 [22297576] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Ага. Прочитать PID из файла, который не удалось открыть. Отличный план. Может, не стоит маяться дурью с файлом, а сразу искать окно?.. Posted via ActualForum NNTP Server 1.5 |
||
20 мар 21, 01:27 [22297594] Ответить | Цитировать Сообщить модератору |
didgik Member Откуда: Сообщений: 968 |
Прочитать PID из файла, который не удалось открыть на запись. Читать можно. Я так понял. А поиск окна я не осилил пока что. В этом и проблема. |
||||||
20 мар 21, 02:11 [22297597] Ответить | Цитировать Сообщить модератору |
Basil A. Sidorov Member Откуда: Сообщений: 10925 |
|
||||
20 мар 21, 06:06 [22297604] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 4 5 вперед Ctrl→ все |
Все форумы / C++ | ![]() |