![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача параметров запущенному приложению ... [D6, Win95/98, WinME, Win2k]
ilysha © (2002-05-23 16:27:00)Вопрос собственно, не совсем такой, как в теме.
Есть статья на странице http://delphi.vitpc.com/helloworld/samples_win.htm, где в доступной форме рассказано, как предотвратить запуск второй версии, и как передать параметры уже запущенному приложению. Вообщем, как делает MS Word и прочие.
Но, если бы всё было так просто, я бы не стал в форуме вопрос писать.
Первый пример статьи показывает прекращение работы программы, если найдена уже запущенная версия. Проверка происходит до Application.Run и работает очень быстро и качественно.
Второй пример - другая концепция - запуск второй копии приложения, проверка, и отправка первой копии сообщения о восстановлении окна приложения и передача параметров командной строки, завершение работы приложения. Пример хороший, только когда приложение большое, а памяти на компьютере 32Мб ой как это долго просходит. Вот об этом автор примера почему-то не подумал...
Итак, у меня, в силу нехватки знаний (и я этого не стыжусь) не получается соединить два примера в один. Может быть, у кого-то есть готовый вариант решения?
ilysha (2002-05-30 09:35:00) [1]Спасибо. Обрабатываю информацию.
leshy (2002-05-27 18:32:00) [2]Кстати, у меня пример с DSKView работает не так, как обещано, о чем я писал в Королевство. Я смотрел его уже после того, как сдал программу, и хотел использовать его принцип немножко в других целях, да обломился.
leshy (2002-05-27 17:44:00) [3]Есть маленький, но сложный способ, я им пользовался один раз: создаётся отдельный модуль с CreateMutex (CreateFileMapping ...) в initialization и созданием объекта (в случае первой копии) с единственным методом AppMessage, который присваивается Application.OnMessage в файле проекта сразу после Application.Initialize. Метод этот обрабатывает сообщение от второй (третьей ...) копии запущенного приложения и хранит полученные данные в динамическом массиве. После полной загрузки приложения данные из динамического массива считываются в порядке поступления, Application.OnMessage переприсваивается и объект уничтожается навсегда.
Соответственно, ссылка на модуль ставится первой в файле проекта, при этом сам модуль ссылается только на system, а все остальные объявления сделаны прямо в нём. Все остальные модули, по необходимости ссылаются на этот модуль.
Передавать данные нужно окну приложения, а не MainForm.
У меня загрузка программы длилась около 30 секунд, а открытие файлов начиналось только после полной загрузки всех внешних модулей по MainForm.OnActivate при ненулевом размере динамического массива. Соответственно, отработка второй копии начиналась ещё до инициализации объекта приложения и была построена по очень сложному принципу передачи данных с предварительной проверкой и последующим подтверждением.
ilysha (2002-05-27 09:13:00) [4]Спасибо keg, но сейчас именно так программа и работает, но это есть не очень красиво, то есть нехорошо.
keg (2002-05-24 10:35:00) [5]Ты можешь написать маленькую бесформенную программу-стартер, которая будет искать нужное окно и если найдет такое, то передаст ему параметры, а если не найдет, то запустит нужную программу (например с помощью ShellExecute) и закроется. Вот пусть юзер её и запускает. Если тебе нужен пример такой программы - пиши.
ilysha (2002-05-24 08:39:00) [6]> eSKey
> PVOzerski
Прочтите внимательнее заданный мною вопрос.
eSKey (2002-05-23 19:08:00) [7]Во, правильная мысль! Причем это надо вообще было сделать раньше, а не доводить до 6,5 мегов...
PVOzerski (2002-05-23 17:03:00) [8]Основную часть проги засунь в DLL, которую динамически подгружай из маленького
стартового модуля. Если копия не 1-я, не доводи дело до загрузки DLL.
ilysha (2002-05-23 16:49:00) [9]>PVOzerski
Представь картину - размер исполняемого файла 6.5Мб, рабочая станция пользователя (Р-233/32Мб) на загрузку файла уходит около 30-40 секунд.
А если еще грузить вторую копию и зупускать - так лучше сразу застрелиться, заколоться, отравиться и утопиться.
PVOzerski (2002-05-23 16:35:00) [10]Да идея-то проста: перед тем, как завершить работу, 2-я копия приложения
должна послать окну 1-й копии некое сообщение, а уж какое и с какими
параметрами - зависит от задачи.