![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
instumental |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.12.2005 Репутация: нет Всего: нет |
Искал как это сделать и находил всегда длиннющие решения, в которых не мог разобраться и которые еще к тому же и не работали почему-то. Сегодня сделал так:
это код dpr.
AppId0071 - это имя главной формы, TAppId071 - это имя класса. Работает так: ищем окно с именем класса как у нашей проги и если находим то показываем его и делам Terminate текущей копии. Код этот работает, глюков не нашел. Надо только чтобы имя класса было уникальным и не совпало с каким-нибудь другим приложением. Вопрос у меня такой. Есть ли здесь какое-нибудь слабое место. Почему всегда предлагают какие-то длинные решения этой задачи, может я что-то не то сделал. |
|||
|
||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 1 Всего: 102 |
instumental ну как минимум:
1. может у другого приложения совпасть имя формы=) 2. возможно твое приложение в рантайме создает форму и в момент проверки оно небыло создано -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Плохо искал ![]() -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
instumental |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.12.2005 Репутация: нет Всего: нет |
1. Конечно может совпасть. Но вероятность этого очень мала. Надо назвать позаковыристее и все. Неприятность я заметил одну. Делфи создает форму с тем же именем. Поэтому при работающей делфи прога не запускается и считает что она уже работает, т.к. находит форму созданную delphi. 2. Не совсем понял. Ищем же главную форму приложения.
Спасибо за ссылку. Я вообще-то не здесь искал (не на этом форуме). Находил такое что мамадарагая. Уже отчаился найти. |
|||
|
||||
ivan219 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: нет Всего: 12 |
А вот мой вареант оцените.
|
||||
|
|||||
Delphins |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 10.8.2005 Где: Россия, Краснодар Репутация: нет Всего: нет |
Пеерменная A не распространяется на всю систему. В другой программе её не будет видно.
Самый лучший способ это послать WM сообщения всем окнам и если прийдет ответ то завершить себя. Иначе работать дальше. |
|||
|
||||
Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
Delphins
это он наверно проверку на форму2 делал... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: нет Всего: 12 |
Этот код для отдельно взятого окна.
А если надо для других то можно повторить этуже операчию только здругими переменными и другими Unit, главное что это работае и копия окна неоткроется пока переменная А имеет значение true. А поповоду "послать WM сообщения всем окнам" можеш поподробнее раскозать ато и вправду лучше будет. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Создай мьютекс с явно уникальным именем. Если вернется ошибка already_exist - это дубликат. В отличие от атома и семафора он гарантированно умрет в момент выгрузки приложения.
Способ с сообщением вообще не универсален - приложение может быть настолько занято собой, что прозевает мессагу. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
проще:
Это сообщение отредактировал(а) Albinos_x - 9.1.2006, 00:33 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
ivan219 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: нет Всего: 12 |
Да немного проще но после закрытия её незльзя болше открыть а сообшение осталось.
Вот ещё вареант. Первая форма
Вторая форма
Это сообщение отредактировал(а) ivan219 - 9.1.2006, 03:16 |
||||
|
|||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Я что-то не пойму, нужно запретить запуск прогаммы или формы? Если формы, то зачем такие извращения, если по Show и ShowModal больше одной копии формы и так не откроется?
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Guedda |
|
|||
![]() Подрывник ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3137 Регистрация: 27.12.2005 Где: Ростов-на-Дону Репутация: 3 Всего: 78 |
А что, так нельзя?:
-------------------- Ll 2 |
|||
|
||||
Delphins |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 10.8.2005 Где: Россия, Краснодар Репутация: нет Всего: нет |
Если для формы то нафига столько кода?
![]() Она не откроется вторая. Конечно если вы её не создаёте в RunTime. Самый просто способ это сообщения WM. Как для программы так и для отдельных форм.
а потом процдуру обрабатывать. Сообщение обработается всегда. Кроме случаев когда оно зависло. Сообщения ставятся в очеред на обработку. Отсылааются они вроде как через SendMessage. Неогу сказать точно потому, что Delphi перестал запускаться. |
|||
|
||||
Romero |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.6.2005 Репутация: 1 Всего: 1 |
Я в одной из своих прог использовал следующий механизм:
При запуске программа пишет куда-либо (в файл или реестр) свой PID. Перед записью из того же места считывается PID предыдущей копии программы и выполняется TerminateProcess. 2 нюанса: - мне нужно было именно перезапускать прогу (убивать старую версию) в случае повторного запуска; - есть небольшой шанс, что убьешь левый процесс (в случае, если предыдущая версия проги завершилась и был запущен процесс с тем же PID). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |