![]() |
![]() |
andr111 07.04.2004 - 17:14 |
Народ, есть такая задача под С++: нужно, чтобы при запуске проги, она находила все уже запущенные экземпляры ЭТОЙ же проги и закрывала их. Находить то их с грехом попалам нахожу, но вот закрыть - никак не получается. Отказывает собака в доступе, я уж и DestroyWindow делал и засовывал ей в поток месагу WM_DESTROY, ну не хавает он сообщения из других потоков и все... А как послать сообщение от имени этого же потока не соображу, хоть убей. Ниужто никак нельзя закрыть окно извне??? НЕ Верю!!! Поможите пожалста, кто чем может. Заранее спасибо. |
xaka 1 - 07.04.2004 - 17:24 |
Тебе нужно почитать про ATOM-ы и как их юзать. Они не позволяют создавать более одного экземпляра приложения. Конечно же не без твоих усилий. Там(точно не помню) нужно написать 3-4 строки кода и все. У тебя всегда будет один эксземпляр. P.S. че найду, сюды сообщу... |
Sabrian 2 - 07.04.2004 - 17:45 |
дефайнь WM_KAPUT=WM_USER+666 (например) напиши его обработчик, закрывающий прогу и что-то там еще что надо делающий теперь допустим при запуске ты узнал handle окна предедущего экземпляра (это тысячей способов сделать можно, например FindWindow) пошли мессадж SendMessage(handle,WM_KAPUT); и все |
nex 3 - 07.04.2004 - 17:48 | автор, сообщите подробнее, Вам надо убить предыдущую копию программы или предотвратить запуск новой? и желательно обоснуйте, зачем. |
Куиуд 4 - 07.04.2004 - 18:08 |
А просто послать сообщение пробовал? SendMessage(......) обычно помогает :) |
Куиуд 5 - 07.04.2004 - 18:13 | в смысле WM_CLOSE |
UE 6 - 07.04.2004 - 18:21 | GetWindowThreadProcessId + TerminateProcess - grubo, but bistro ;) |
Sabrian 7 - 07.04.2004 - 18:30 | Не просто грубо, на мой взгляд недопустимо, программе ведь необходимо ресурсы в систему вернуть. |
nex 8 - 07.04.2004 - 18:46 | это какие такие ресурсы вернуть? :) |
ScrewDriver 9 - 07.04.2004 - 18:46 |
А может просто предотвратить повторный запуск проги? с помощью ф-ии FindWindow ? |
Sabrian 10 - 07.04.2004 - 19:01 |
Программа могла воспользоваться ресурсами создаваемыми любым сервером,неважно каким, важно лишь то, что некоторый ресурс(оперативка,дисковое пространство,процессорное время, сетевой траффик и.т.д) был взят сервером, скажем так из пула ресурсов или им создан, тогда т.к. при принудительном завершении процесса процесс не сообщает серверу, что все, освобождай ресурсы, то сервер уже вероятно никогда эти ресурсы и не уничтожит (вернет в пул). А серверов этих полно, они используются всюду COM/ActiveX, Сorba, OpenGL и соответственно DirectX(COM) и.т.д. , а если программа написана с использованием чего-то типа VCL, то это вообще абзац, потерминатишь её раз 20-30 и оперативка кончается. |
andr111 11 - 07.04.2004 - 19:19 |
Надо именно закрыть старую версию, предотвратить запуск новой - не пробема. Просто при переходах по базе постоянно открывается окно с новой информацией, а старое нужно закрывать. С базой работают в Аксесе, а окно сделано в Билдере, такой вот геморрой (камни не кидайте, это мой дипломник придумал). А проблему я решил просто, SendMessage(hwnd, WM_QUIT):^) To Sabrian, чесно гря не пробывал, но в описании PeekMessage говорится, что она не обрабатывает сообщения посланные другим потоком, а ведь посылать WM_USER+ я буду из другого экземпляра проги, т.е. из другого потока, или я не прав? Спасибо всем за высказывания |
Sabrian 12 - 07.04.2004 - 19:33 | PeekMessage не читает сообщения посланные другому потоку, а не другим потоком. Т.е из потока А можно читать только сообщения посланные потоку А но не В, но вот послать эти сообшения мог как А так и B |
UE 13 - 07.04.2004 - 20:27 |
2Sabrian: > то сервер уже вероятно никогда эти ресурсы и не уничтожит (вернет в пул). hm... serveri po timeoutu, naprimer, osvobozhdaut resursi... inache eto ochen hrenovie serveri ;) PS sorry, po russian seichas ne mogu nabirat :( |
Sabrian 14 - 08.04.2004 - 11:51 | Почему хреновый? Спецификация COM не предлагает постоянного оповещения о продолжении использования обьекта поэтому уничтожить его по таймоуту не удастся, мало ли на сколько он клиенту понадобился? |
UE 15 - 08.04.2004 - 16:09 | 2Sabrian, sluchai in-process ili out-process ti imeech v vidu? |
Sabrian 16 - 09.04.2004 - 01:54 | Out |
Sabrian 17 - 09.04.2004 - 02:05 | ??? |