• 0
OnePeople

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

Вопросы

Платформа: Windows

FMX

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 ответов на этот вопрос

  • 0

Как понял в firemonkey нужно создать программно отдельное окно невидимое через  AllocateHWND, но как с этим работать??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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
добавил абзац

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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