Связь приложений
Я пишу MDI-приложение. Расширение файлов, обрабатываемых приложением, регистрируется в ОС и ассоциируется с ....exe. В событии OnShow главной формы приложения имеется обработка параметров загрузки. Таким образом двойной клик на файле -> запуск КОПИИ приложения и автоматическая обработка его содержимого реализованы (в добавок реализован и Drag&Drop файлов).
Но пользователю можно работать только с одной копией программы (мне так нужно), поэтому в событии OnCreate главной формы стоит поцедура, которая ищет запущенную копию приложения по заголовку Application.Title и если находит, то ПРЕРЫВАЕТ свою работу и активизирует найденный оригинал. Следовательно, если в параметрах загрузки был адрес файла, то он теряется и "загрузки" файла в работающий оригинал приложения не происходит.
1. Что делать?
Лично, я решил, что нужно его передавать (пересылать) в работающий оригинал приложения. И воспользовался событием WM_COPYDATA для этого.
Но тут опять подводный камень - WM_COPYDATA работает с заголовками окон. В моем случае это заголовок главной формы. Если в работающем оригинале приложения пользователь не запустил дочернего окна, то заголовок = MainForm.Caption, но если запустил, то = MainForm.Caption-[MDIChild.Caption]. Конечно при условии, что дочернее окно развернуто полностью. В результате WM_COPYDATA не может послать сообщение правильному адресату, т.к. копии приложения MDIChild.Caption - неизвестно.
2. А что делать в этом случае?
3. Кто как решил эти проблемы?
Данные ведь можно не только через WM_COPYDATA пересылать
см. CreateMutex, OpenMutex