Перейти к содержанию
Fire Monkey от А до Я
  • 0

Передача параметра программе


OnePeople

Вопрос

Платформа: Windows

FMX

Сделал просмоторщик изображений, сделал ассоциацию файлов, открытие их,

if ParamStr(1)<>'' then
  begin
   tFileName.Text:=ParamStr(1);
   imMain.Bitmap.LoadFromFile(ParamStr(1));
  end;

запретил запуск второй копии. Теперь собственно вопрос, а как теперь передать запущенному ранее экземпляру программы путь до нового файла???

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Может до запрета запуска второй копии как-то передать "сообщение" ( ParamStr(1) ) уже запущенной копии?

Изменено пользователем afors
Опечатка
Ссылка на комментарий
  • 1

Есть волшебная аббревиатура - IPC. Inter process communication.
Считайте, что у вас два разных приложения.Абсолютно разных. Которым нужно взаимодействовать друг с другом. Одно - источник, второе - приемник.
Среди вариантов для Windows:
1. Через сообщения, например - WM_COPYDATA (емнип, так обзывается). Нужно знать хендл окна, которому отправится сообщение (не уверен, что с WM_COPYDATA пройдет фокус с функцией BroadcastMessage) и нужно чтобы целевое приложение было на том же уровне изоляции (UIPI, кажется). Т.е. если приемник запущен от админа, а источник - как обычное приложение - этим способом их не состыковать.
2. Через NamedPipes. Способ хорош для организации постоянного обмена между двумя любыми приложениями на одном компьютере (не только, но чаще всего - на одном). Для однократной передачи информации держать слушающий пайп в отдельном потоке, наверное, избыточно. Хотя я бы взял именно этот способ.
3. TCP/IP и надстройки над ним: http, ftp и другое tp. Чаще всего используются для организации обмена между приложениями на разных компьютерах. Для локального - избыточно, да и проблемы с файрволлом могут быть.
4. Через файловые потоки или данные в файле подкачки. Одно приложение пишет, второе периодически смотрит "а не появилось ли для меня чего нового". Как-то делал даже двусторонний обмен данными по этому механизму.

Это навскидку. Выбирайте, потом можно говорить дальше.

Ссылка на комментарий
  • 0

Делал через первый способ, но 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
45 минут назад, OnePeople сказал:

FMX приложение не хочет ловить сообщения 

Самые очевидные ошибки и недочеты:

1. Почему FindWindowA? Зачем явное указание Ansi-версии этой функции?

2. cbData - это размер данных в байтах. 1 символ <> 1 байт.

3. SendMessage - это функция. И она возвращает результат. Его необходимо анализировать.

4. StrLCopy... вы уверены, что ParamStr(1) влезет в 100 символов?

Ощущение, что этот код вы скопировали из какого-то VCL примера времен Delphi5

Ссылка на комментарий
  • 0
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. И что я от этого могу узнать?

Изменено пользователем OnePeople
Ссылка на комментарий
  • 0
В 02.03.2018 в 16:13, OnePeople сказал:

Да мне главное чтобы приходило, а оно вообще не приходит т.к. ShowMessage('Получено сообщение от другой копии'); не отрабатывает

Недавно столкнулся с аналогичной проблемой, только отправителем был FMX а получателем VCL. Сообщение не приходило потому что была криво заполнена структура TCopyDataStruct, а именно lpData:Pointer. Компилятор при этом не ругался (подозреваю что происходил какой то AV, но делал это молча). К сожалению под рукой нет кода для примера, но когда исправил данные, сообщение начало приходить. Надеюсь кому-то помог.

Ссылка на комментарий
  • 0
В 10.10.2018 в 10:49, Zyablik3000 сказал:

Сообщение не приходило потому что была криво заполнена структура TCopyDataStruct

Стандартная практика при работе с WinAPI - после выделения памяти под структуру заполнить ее нулями.

Ссылка на комментарий
  • 0

Я не об этом. Я о том что указатель на передаваемые данные, который помещается в поле lpData, ссылался на абракадабру.

Причём такое поведение наблюдалось при пересылке из FMX в VCL.

Изменено пользователем Zyablik3000
добавил абзац
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...