Я прошу прощения за длину вопроса, но я считаю, что трудно понять «почему» без фона.
Справочная информация: У меня два приложения, работающие в WindowsВстроенная среда Standard 7.Это должны быть только два приложения, работающие на машине.Один, называемый «Контроллер», написан на C ++, другой, «DBconnector», написан на C #.Это не новый код.Он активно используется и развивается уже почти 20 лет.
Цель программного обеспечения - запустить производственный станок для производства деталей.Эти машины большие и опасные в случае сбоя программы.Давным-давно я обнаружил, что если сеть по какой-то причине выйдет из строя, все потоки в приложении остановятся, а не только сетевой.Это было катастрофически, поскольку оставление контроллера в неправильном состоянии в крайне редких случаях может привести к буквальному взрыву машины.Примечание. Чтобы предотвратить это, в программное и аппаратное обеспечение было добавлено несколько вещей.Хотя этой опасности больше не существует, стабильность по-прежнему чрезвычайно важна.Я никогда не хочу, чтобы оператор застрял в состоянии, когда он не может нажать кнопку сброса.Моим решением в то время было перенести сетевые задачи в отдельное приложение.В то время ОС была основана на Windows XP.Я понятия не имею, существует ли проблема в Windows 10, поскольку я действительно не хочу переписывать сотни тысяч строк кода, чтобы попытаться объединить две программы сейчас.
Разработка двух программ разошлась таким образом, что одна, которая контролировала машину, Controller, была разработана для предельной стабильности, а другая, DBconnector, была тем местом, где происходили опасные вещи, такие как работа в сети и большинство операций ввода-вывода файлов.Связь между двумя программами облегчается благодаря использованию файла сопоставления памяти, к которому они оба могут получить доступ.У меня нет проблем с совместным использованием оконных дескрипторов или идентификаторов процессов или любых других данных, которые могут потребоваться между двумя программами.
Вот мой вопрос. Как я могу заставить приложение Controller отображать графический интерфейс DBconnector?Например, я начал добавлять функциональность в контроллер, которая требует 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 #.