OnePeople Опубликовано 28 февраля, 2018 Поделиться Опубликовано 28 февраля, 2018 Платформа: Windows FMX Сделал просмоторщик изображений, сделал ассоциацию файлов, открытие их, if ParamStr(1)<>'' then begin tFileName.Text:=ParamStr(1); imMain.Bitmap.LoadFromFile(ParamStr(1)); end; запретил запуск второй копии. Теперь собственно вопрос, а как теперь передать запущенному ранее экземпляру программы путь до нового файла??? Цитата Ссылка на комментарий
0 OnePeople Опубликовано 1 марта, 2018 Автор Поделиться Опубликовано 1 марта, 2018 Как понял в firemonkey нужно создать программно отдельное окно невидимое через AllocateHWND, но как с этим работать?? Цитата Ссылка на комментарий
0 afors Опубликовано 1 марта, 2018 Поделиться Опубликовано 1 марта, 2018 (изменено) Может до запрета запуска второй копии как-то передать "сообщение" ( ParamStr(1) ) уже запущенной копии? Изменено 1 марта, 2018 пользователем afors Опечатка Цитата Ссылка на комментарий
1 kami Опубликовано 1 марта, 2018 Поделиться Опубликовано 1 марта, 2018 Есть волшебная аббревиатура - IPC. Inter process communication. Считайте, что у вас два разных приложения.Абсолютно разных. Которым нужно взаимодействовать друг с другом. Одно - источник, второе - приемник. Среди вариантов для Windows: 1. Через сообщения, например - WM_COPYDATA (емнип, так обзывается). Нужно знать хендл окна, которому отправится сообщение (не уверен, что с WM_COPYDATA пройдет фокус с функцией BroadcastMessage) и нужно чтобы целевое приложение было на том же уровне изоляции (UIPI, кажется). Т.е. если приемник запущен от админа, а источник - как обычное приложение - этим способом их не состыковать. 2. Через NamedPipes. Способ хорош для организации постоянного обмена между двумя любыми приложениями на одном компьютере (не только, но чаще всего - на одном). Для однократной передачи информации держать слушающий пайп в отдельном потоке, наверное, избыточно. Хотя я бы взял именно этот способ. 3. TCP/IP и надстройки над ним: http, ftp и другое tp. Чаще всего используются для организации обмена между приложениями на разных компьютерах. Для локального - избыточно, да и проблемы с файрволлом могут быть. 4. Через файловые потоки или данные в файле подкачки. Одно приложение пишет, второе периодически смотрит "а не появилось ли для меня чего нового". Как-то делал даже двусторонний обмен данными по этому механизму. Это навскидку. Выбирайте, потом можно говорить дальше. Brovin Yaroslav, Ingalime и Равиль Зарипов (ZuBy) 3 Цитата Ссылка на комментарий
0 OnePeople Опубликовано 2 марта, 2018 Автор Поделиться Опубликовано 2 марта, 2018 Делал через первый способ, но FMX приложение не хочет ловить сообщения hwin := FindWindowA(nil,'Photo_NP'); SetForegroundWindow(hwin); SetFocus(hwin); // ShowWindow(hwin, SW_restore); with ParamCmd do begin dwData := 0; cbdata:=strlen(pchar(paramstr(1)))+1; lpData:=pchar(paramstr(1)); end; SendMessage(hwin, WM_COPYDATA,0,longint(@ParamCmd)); На передний план вылазит, а сообщение не принимает( protected procedure Getmessage(var msg: TWMCopyData); message WM_COPYDATA; procedure TfMain.Getmessage(var msg: TWMCopyData); var sText: array[0..99] of Char; begin ShowMessage('Получено сообщение от другой копии'); StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); //Преобразуем полученные данные в строку tFilePath.Text:=stext; end; Цитата Ссылка на комментарий
0 kami Опубликовано 2 марта, 2018 Поделиться Опубликовано 2 марта, 2018 45 минут назад, OnePeople сказал: FMX приложение не хочет ловить сообщения Самые очевидные ошибки и недочеты: 1. Почему FindWindowA? Зачем явное указание Ansi-версии этой функции? 2. cbData - это размер данных в байтах. 1 символ <> 1 байт. 3. SendMessage - это функция. И она возвращает результат. Его необходимо анализировать. 4. StrLCopy... вы уверены, что ParamStr(1) влезет в 100 символов? Ощущение, что этот код вы скопировали из какого-то VCL примера времен Delphi5 Brovin Yaroslav 1 Цитата Ссылка на комментарий
0 OnePeople Опубликовано 2 марта, 2018 Автор Поделиться Опубликовано 2 марта, 2018 (изменено) 4 часа назад, kami сказал: Самые очевидные ошибки и недочеты: 1. Почему FindWindowA? Зачем явное указание Ansi-версии этой функции? 2. cbData - это размер данных в байтах. 1 символ <> 1 байт. 3. SendMessage - это функция. И она возвращает результат. Его необходимо анализировать. 4. StrLCopy... вы уверены, что ParamStr(1) влезет в 100 символов? Ощущение, что этот код вы скопировали из какого-то VCL примера времен Delphi5 1.Потому что так работает и он находит окно, так как SetForegroundWindow(hwin) отрабатывает 2.4. Да мне главное чтобы приходило, а оно вообще не приходит т.к. ShowMessage('Получено сообщение от другой копии'); не отрабатывает 3. И что я от этого могу узнать? Изменено 2 марта, 2018 пользователем OnePeople Цитата Ссылка на комментарий
0 Zyablik3000 Опубликовано 10 октября, 2018 Поделиться Опубликовано 10 октября, 2018 В 02.03.2018 в 16:13, OnePeople сказал: Да мне главное чтобы приходило, а оно вообще не приходит т.к. ShowMessage('Получено сообщение от другой копии'); не отрабатывает Недавно столкнулся с аналогичной проблемой, только отправителем был FMX а получателем VCL. Сообщение не приходило потому что была криво заполнена структура TCopyDataStruct, а именно lpData:Pointer. Компилятор при этом не ругался (подозреваю что происходил какой то AV, но делал это молча). К сожалению под рукой нет кода для примера, но когда исправил данные, сообщение начало приходить. Надеюсь кому-то помог. Цитата Ссылка на комментарий
0 kami Опубликовано 11 октября, 2018 Поделиться Опубликовано 11 октября, 2018 В 10.10.2018 в 10:49, Zyablik3000 сказал: Сообщение не приходило потому что была криво заполнена структура TCopyDataStruct Стандартная практика при работе с WinAPI - после выделения памяти под структуру заполнить ее нулями. Цитата Ссылка на комментарий
0 Zyablik3000 Опубликовано 11 октября, 2018 Поделиться Опубликовано 11 октября, 2018 (изменено) Я не об этом. Я о том что указатель на передаваемые данные, который помещается в поле lpData, ссылался на абракадабру. Причём такое поведение наблюдалось при пересылке из FMX в VCL. Изменено 11 октября, 2018 пользователем Zyablik3000 добавил абзац Цитата Ссылка на комментарий
Вопрос
OnePeople
Платформа: Windows
FMX
Сделал просмоторщик изображений, сделал ассоциацию файлов, открытие их,
if ParamStr(1)<>'' then begin tFileName.Text:=ParamStr(1); imMain.Bitmap.LoadFromFile(ParamStr(1)); end;
запретил запуск второй копии. Теперь собственно вопрос, а как теперь передать запущенному ранее экземпляру программы путь до нового файла???
Ссылка на комментарий
9 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.