Как интегрировать пользовательский интерфейс одного приложения в другое?

Прошу прощения за объем вопроса, но я считаю, что трудно понять "почему" без фона.

История вопроса: у меня есть два приложения, работающих в среде Windows Embedded Standard 7. Они должны быть единственными двумя приложениями, работающими на машине. Один, называемый "Контроллер", написан на C++, другой, "DBconnector", написан на C#. Это не новый код. Он активно используется и развивается почти 20 лет.

Цель программного обеспечения - запустить производственную машину для производства деталей. Эти машины большие и опасны, если программа выйдет из строя. Давным-давно я обнаружил, что если сеть по какой-то причине выйдет из строя, остановятся все потоки в приложении, а не только сетевой поток. Это было катастрофой, так как оставление контроллера в состоянии с неправильными реле в чрезвычайно редких случаях могло привести к буквально взрыву машины. Примечание. В программное и аппаратное обеспечение было добавлено несколько вещей, чтобы предотвратить это. Хотя на самом деле этой опасности больше нет, стабильность по-прежнему чрезвычайно важна. Я никогда не хочу, чтобы оператор застрял в состоянии, когда он не может нажать кнопку сброса. В то время я решил переместить сетевые задачи в отдельное приложение. В то время ОС была основана на Windows XP.Я понятия не имею, существует ли проблема в Windows 10, поскольку я действительно не хочу сейчас переписывать сотни тысяч строк кода, чтобы попытаться объединить две программы.

Разработка двух программ расходилась, так что одна, которая управляла машиной, Controller, была разработана для обеспечения максимальной стабильности, а другая, DBconnector, использовалась там, где происходили опасные вещи, такие как работа в сети и большая часть файлового ввода-вывода. Связь между двумя программами упрощается с помощью файла с отображением памяти, к которому они обе имеют доступ. У меня нет проблем с совместным использованием оконных дескрипторов, идентификаторов процессов или любых других данных, которые могут потребоваться между двумя программами.

Вот мой вопрос. Как я могу заставить приложение Controller отображать графический интерфейс DBconnector? Например, я начал добавлять в Controller функции, которые требуют, чтобы DBconnector отображал листы контроля качества, которые хранятся на веб-сайте на серверах компании. Я хочу, чтобы оператор мог подтянуть лист контроля качества прямо на машине. В настоящее время оператор взаимодействует только с приложением Controller. Я не хочу, чтобы контроллер имел доступ к сети. Кроме того, в C# есть некоторые инструменты, облегчающие отображение веб-страницы. Мне кажется, место для этого - DBconnector. Проблема в том, что DBconnector работает в фоновом режиме и в настоящее время не может быть виден или доступен пользователю. Итак, вопрос в том, как это решить.

Первый вариант, который я пробовал, - сказать DBconnector, чтобы он вышел вперед и поместил контроллер в фоновый режим. Затем, когда пользователь закончит, контроллер возвращается на передний план. Я заставил это работать с помощью некоторых хаков, но это непоследовательно. Уловка, которую я использовал, заключалась в том, чтобы минимизировать, а затем максимизировать DBconnector, что, кажется, большую часть времени выводит его на передний план и пытается сосредоточить внимание на одном или другом. Еще может быть способ сделать это таким образом, но он должен быть последовательным.

Второй вариант - запустить приложение DBconnector в одном из окон контроллера. Понятия не имею, как это сделать. Я думал об использовании ATL или COM, но я думаю, что они работают как потоки в процессе контроллеров, а не как отдельное приложение.

Третий вариант, который я рассмотрел, - создать окно внутри контроллера, которое перехватывает и передает все вводимые пользователем сообщения непосредственно в Dbconnector с помощью дескриптора сообщения Windows и делает снимок экрана DBconnector всякий раз, когда он становится недействительным, и передает его через файл с отображением памяти. В настоящее время я к этому склоняюсь.

Есть ли какие-либо предложения о том, как сделать первый и последний вариант лучше, или как вообще сделать второй вариант, или другое решение, которое я пропустил? Имейте в виду, что наше текущее оборудование работает под управлением Windows Embedded Standard 7. В настоящее время проект находится в Visual Studio 2015. Оконная технология C++ - это MFC, реализованная с использованием библиотек, изначально созданных примерно в 2003 году. DBconnector находится в.NET framework 4 на C#.

0 ответов

Другие вопросы по тегам