![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Программа работает из трея. С этой программой я ассоциировал свой тип файла. Если программа в данный момент не загружена, то двойным щелчком по данному файлу я открываю программу и работаю с ней и теми данными, которые есть в этом файле. Но что делать, если программа уже запущена и мне не нужно запускать ее второй раз. Я использую мьютексы для того, чтобы блокировать вторую копию программы. Но как мне сделать, чтобы уже запущенной первой копии программы была известна информация из ассоциированного файла?
Код OnCreate главной формы программы:
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
sexton |
|
|||
![]() sexton=Пономарь (eng) ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 5.5.2004 Где: Ульяновск Репутация: 1 Всего: 9 |
Оригинальная задача... может сделать некое подобие autoexec, чтобы при запуске программы по щелчку, данные копировались в файл, из которого программа будет читать данные по умолчанию при каждом запуске.
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Найди копию программы по FindWindow и отправь ей WM_COPYDATA, а в нем путь к файлу.
|
|||
|
||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Можно небольшой пример по этому делу, а то что-то недогоню никак... -------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Поиск по форуму, довольно часто проскакивали темы по WM_COPYDATA. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
MacTep |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Нашел в темах форума следующее:
Добавлено @ 00:07 И еще нашел следующее:
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
||||
|
|||||
Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Передает абсолютно любые данные.
Это и есть пример.
Вот этот пример со строкой.
|
||||
|
|||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
А что это за dwData и почему в примере стоит именно 10?
![]() -------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Там же написано - любое 32-битное число.
Можешь вообще в него ничего не писать. Сделано на случай, если ты будешь посылать разные данные. Тогда ты сможешь различать их по данному числу. Но в твоем случае данные только одни - строка с именем файла. Так что тебе оно не нужно. Хотя для надежности можешь все же вставить проверку - вдруг это другая программа отправила тебе это сообщение по ошибке. По своему числу сможешь отличить свое от не своего.
|
||||
|
|||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Спасибо, за терпение к глупым вопросам повышаю репутацию!
![]() -------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Не знаю, парни, или я такой или лыжи такие странные!
![]()
Так вот беда в чем: вроде бы как данные передаются. Но если в первой процедурке строчку "Halt;" закомментировать, то вторая копия приложения не завершит свою работу. Так вот при этом происходит, что все действия, которые выполняются во второй процедуре, выполняются именно со второй копией приложения, а не с первой. Как сделать так, чтобы данные действия были применимы только лишь к первой инстанции приложения??? Уже из сил выбился. Кучу информации перечитал, а так ничего ин е добился... ![]() Это сообщение отредактировал(а) MacTep - 10.2.2006, 13:58 -------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Добавлено @ 14:31 Вот пример программы, которая ищет себя запущенную. Если находит, то отправляет себе ParamStr(1) и умирает. Если не находит - запускается. Обрати внимание, что у Form1 Name оставлен не стандартный, а сделан уникальным, чтобы не перепутать себя с другими. В примере я просто сделал вывод полученной строки в ShowMessage. Замени на любой свой код и все. |
||||
|
|||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
А вот теперь действительно все...
![]() Это сообщение отредактировал(а) MacTep - 11.5.2006, 21:09 -------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Еще одна проблема с этим вопросом. Все отлично работает, если запускать программу при помощи ассоциированного с ней файла. Но если просто запустить программу из экзехи, потом второй раз, потом третий, то будут созданы и второй и третий и т.д. экземпляры программы. Как нужно изменить процедурку AppExist, чтобы она даже при таком запуске позволяла запустить программу только 1 раз?
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
MacTep,
Неправильно искать второй экземпляр по имени окна. В топике было праильное решение - использовать мьютекс.
Вместо комментариев - либо Exit, либо Halt. Но у тебя 2 задачи. КРоме того, чтобы не допустить второго запуска программы, тебе надо еще и передать параметры уже запущенной копии. Для этого проще воспользоваться MMF - Memory Mapped File. Запущенное приложение первым делом создает MMF, записывает туда нужную информаци, например - дескриптор окна, которому можно посылать сообщения, параметры пли запуске, и вообще любую информацию. При запуске второй копии приложение также пытается создать MMF, но, так как MMF уже существует, просто открывает его, записывает нужную информацию и посылает сообщение первой копии. -------------------- |
|||
|
||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
Примерчик можно? Первый раз слышу о MMF.
Это сообщение отредактировал(а) MacTep - 13.5.2006, 20:06 -------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
MacTep |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: 4 Всего: 4 |
А вот еще вопрос такой: обязательно что ли использовать WM_COPYDATA. Просто не получится разве при помощи ParamStr(1)?
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Вот простенький пример, очень схематично и упрощенно, но для демонстрации подойдет: unit
Это сообщение отредактировал(а) Демо - 14.5.2006, 16:33 -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |