Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача параметров запущенному приложению ... [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-й копии некое сообщение, а уж какое и с какими
параметрами - зависит от задачи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо