Как запустить программу внутри программы

Я набросаю сценарий, который я хотел бы заставить работать ниже. У меня есть одно основное приложение. Это приложение, основанное на взаимодействии с пользователем, может загружать другие приложения в защищенной среде/оболочке. Это означает, что эти дочерние приложения больше не могут взаимодействовать ни с ОС, ни друг с другом.

Родительская программа может в любой момент вызывать функции этих дочерних программ. Дочерняя программа может в любой момент вызывать функции этих родительских программ. Кто-нибудь знает, как это реализовать на С++? Желательно, чтобы и родительский, и дочерний элементы были написаны на C++.

Производительность загрузки дочерних приложений внутри родительского приложения не имеет значения. Единственное, что имеет значение, — это производительность связи между дочерними и родительскими функциями при вызове функций друг друга.

задан 09 июля ’13, 20:07
fork() + exec() серия функций поможет вам. — Grijesh Chauhan

Для этого нет стандартного способа С++, ответ должен быть специфичным для операционной системы. Уточните, пожалуйста, на какие операционные системы вы ориентируетесь. — Andrew Tomazos

Как запустить программу в свернутом виде при автозагрузке

Похоже, вам нужна какая-то виртуальная машина, иначе надежная песочница предварительно скомпилированных двоичных приложений может быть затруднена. Но, вероятно, лучший способ — дать детям использовать язык сценариев, чтобы они могли делать только то, что родитель делает за них. — hyde

4 ответы

Вам придется написать свой собственный компилятор. Учтите: ни одна обычная ОС не поддерживает то, что вы хотите. Вы хотите, чтобы оба исполняемых файла запускались внутри одного процесса, но этот процесс может или не может выполнять вызовы ОС в зависимости от некоторых странностей внутри процесса, которые ОС вообще не понимает. Это больше не проблема вашего пользовательского компилятора, так как он просто не будет создавать некорректные инструкции. Это похоже на Java и .Net, которые также предотвращают такие вызовы ОС вне их контроля.

Создан 09 июля ’13, 22:07

Дочерний процесс не может получить доступ к ОС. Они не обязательно должны быть исполняемыми. Они могут быть отдельными процессами, но не означает ли это, что вы не можете их контролировать? — Йерун

Они не могут быть отдельными процессами. Тривиально: вы не можете вызывать функции через границы процесса. — MSalters

. если вы не считаете механизмы RPC вызовами функций (что, я думаю, вы могли бы, если бы говорили достаточно свободно) — Джереми Фриснер

  1. Сделать профиль AppArmor со «шляпами» («шляпа» — это конфигурация песочницы, на которую приложение может переключаться программно с помощью libapparmor),
  2. пусть основное приложение создаст «трубу»,
  3. иметь основное приложение «форк»,
  4. изменить на «шапку», соответствующую дочернему приложению,
  5. «exec» дочернее приложение,
  6. основное приложение и дочернее приложение взаимодействуют через созданный ранее «канал».

Создан 09 июля ’13, 22:07

Запуск программ

Насколько я понимаю, это не мешает ребенку взаимодействовать с ОС, что крайне важно. — Йерун

Binero, наличие «безопасной среды» и «предотвращение взаимодействия ребенка с ОС» — не одно и то же. Последнее в большинстве случаев не имеет практической ценности. — АртемГр

Если вам нужен (полу) кроссплатформенный способ сделать это, вы можете использовать RPC для вызова функций в другом процессе. Он будет работать на всем, что поддерживает распределенную вычислительную среду. Он существует уже некоторое время, и в документации msdn говорится, что части окон используют его для межпроцессного взаимодействия, поэтому, вероятно, он достаточно быстр. Вот учебник по msdn, который поможет вам начать работу http://msdn.microsoft.com/en-us/library/windows/desktop/aa379010.aspx Плохо то, что я не смог найти учебник по его использованию в Linux.

Читайте также:
В какой программе создать пригласительные на свадьбу

Если вы не хотите использовать RPC или вам слишком сложно найти хорошую документацию по этому вопросу, вы можете использовать стандартные механизмы IPC (межпроцессное взаимодействие) из систем unix, чтобы сигнализировать вашему процессу, что он должен вызывать определенную функцию. Я бы рекомендовал очередь сообщений, потому что она очень быстрая и легкая. Вы можете найти учебник здесь: http://www.cs.cf.ac.uk/Dave/C/node25.html

Создан 09 июля ’13, 21:07

Я не знаком с ограничениями ОС в приведенных выше ответах. Однако я нашел простой способ решить эту проблему. Я надеюсь, что это поможет и не имеет технических проблем. Я использовал ОС Linux. Предположим, я хочу вызвать программу B на C++ внутри другой программы A на C++.

Я написал Perl-скрипт (например, PerlScript.pl), который содержит системный вызов для запуска программы B. Затем в A я сделал системный вызов, например system(«perl PerlScript.pl»), которые просят Perl запустить B вместо меня.

ответ дан 27 авг.

. system таким образом открывает очень серьезные уязвимости в коде, особенно если человек, запускающий его, может создать свой собственный файл PerlScript.pl и заменить его. Также не поддерживает два процесса, «вызывающие функции друг друга в любое время» без дополнительного кода. в обоих. — Ник Рид

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ linux shell or задайте свой вопрос.

Источник: stackovergo.com

C# Разработка

https://bitbucket.org/sergey_vaulin/wpf-application-host

Хочу поделиться с вами способом, как можно окно внешнего приложение «встроить» в свою программу. Ситуация из жизни: разрабатывая CRM систему для заказчика может появиться потребность, в одном из сценариев обслуживания, дать пользователю возможность произвести какие то манипуляции во внешней системе. Если эта система является Web сайтом, то задача решается добавлением WebBrowser на форму. Но представьте, что это какое то приложение, и что тогда делать?
Для этого можно провернуть трюк используя WinAPI, в результате которого окно внешнего приложения окажется «внутри» нашего (как будто экран виртуальной машиной), но у заказчика будет складываться иллюзия того, что мы его запустили внутри нашего приложения. И это похоже на магию.

  • Notepad — блокнот.
  • Write — простой редактор документов.
  • Regedit — редактор реестра.

Write редактор:

Редактор реестра:

Как это работает?

Нет, это не запуск приложения внутри нашего. Если отрыть Process Explorer, то можно увидеть, что мы запустили нужное приложение вне нашего процесса.

Трюк заключается в следующем:

  1. Запускаем нужное приложение (к примеру regedit.exe).
  2. Ожидаем, пока оно передёт в Idle состояние.
  3. Получаем у него Process.MainWindowHandle — это дескриптор главного окна внешнего приложения.
  4. На форме WPF (если используемся WinForm то можно без хоста) размещается WindowsFormsHost, дающий возможность использовать WinForm компоненты.
  5. В свойство Child у WindowsFormsHost размещается UserControlWinForms. Он будет выполнять функцию хоста окна внешнего приложения так как имеет Handle окна.
  6. Последняя итерация — это используя WinAPI функцию SetParent у внешнего окна выставить родителем UserControl от WinForms.
  7. Готово! Приложение магическим образом появилось внутри.

Внимание! Использованный TabControl ведёт себя так, что при переключении вкладок с Template происходит не создание нового UserControl, а использование одного для каждой вкладки. Поэтому и происходят постоянные запуски новых приложений при каждом переключение. Так же замечал глюк, что TabControl самопроизвольно переключал вкладки, поэтому будьте внимательны.

Можно ли не использовать WindowsFormsHost?

Казалось бы, почему бы не сделать все то же самое, но без WindowsFormsHost? Добавить обычный WPF UserControl и попытаться на нём разместить приложение, но тут нас ждёт разочарование. Все UI элементы в WPF наследуются от класса Visual и не имеют Win32 Handle окна, а значит редерингом окна занимается не Windows, а внутренние механизмы WPF. В этом можно убедиться, запустив Spy++ (Утилита идущая с Visual Studio и являющаяся аналогом Snoop, но для Win32 приложений), и нацелив на окна приложений написанных на WPF и Win32. Мы увидим следующее:

  • Анализируя стандартный Win32 калькулятор, мы видим, что все элементы управления окна появились в дереве, в иерархическом виде.
  • Для примера WPF приложения я выбрал главную форму окна существующего Enterprise решения. Как видно, в списке нет Children окон, как было сказано выше, рендеренгом занимается WPF Engine и для системы видно только главное окно.
Читайте также:
Программа не отображается в процессах


Ниже приведу изображение с хостинга приложения, на котором появилось Win32 окно, совместимое с окнами ОС Windows. Функцию хостинга осуществляет окно с именем класса WindowsForms.

Как использовать?

  • ApplicationPath — путь до исполняемого файла приложения.
  • ApplicationRunning — признак того, что приложение запущено.
  • ErrorText — содержит текст текущей ошибки.
  • MainWindowShowTimeoutSeconds — время, которое надо ждать дополнительно до момента создания главного окна приложения. Бывает ситуация, что приложение перешло в состояние Idle, но главное окно ещё не создалось. Поэтому Handle будет NULL. Выставив это значение, мы дадим приложению шанс полностью открыться за указанное время.

Заключение.

В заключении хотелось бы сказать, что помимо размещения окна я устанавливаю HOOK функцию на Win32 события внешнего приложения через SetWinEventHook. Её задумка в том, что если вам потребуется хостить внутри не только главное окно, но и ВСЕ создаваемые приложением окна, то достаточно в методе HOOK отлавливать событие создания новых окон и менять их Parent, как для главного окна. Возможно в будущем я добавлю эту возможность через флаг. Помимо этого вы можете контролировать всю активность внешнего приложения, устанавливать значения полей, нажимать на кнопки и вести себя как «БОТ» с целью автоматизировать какие то операции. Для этого пользуйтесь SendMessage и PostMessage функциями.

Рекомендуемые ссылки:

Источник: www.devowl.net

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

Я читала много о том, как запустить приложение из программы C# (процесс.Start ()), но я не смог найти никакой информации о том, как запустить это новое приложение в панели моей программы на C#. Например, я хотел бы нажать кнопку, чтобы открыть блокнот.exe внутри моего приложения, а не снаружи.

автор: Kiquenet

8 ответов

Я не знаю, по-прежнему ли это рекомендуется использовать, но фреймворк «связывание и встраивание объектов» позволяет вставлять определенные объекты/элементы управления непосредственно в ваше приложение. Вероятно, это будет работать только для определенных приложений, я не уверен, что Notepad является одним из них. Для действительно простых вещей, таких как блокнот, вам, вероятно, будет проще работать с элементами управления текстовым полем, предоставляемыми любым используемым вами носителем (например, WinForms).

вот ссылка на OLE информация для начала работы:

автор: Andy White

С помощью win32 API можно «съесть» другое приложение. В основном вы получаете верхнее окно для этого приложения и устанавливаете его родителем, чтобы быть ручкой панели, в которую вы хотите поместить его. Если вы не хотите эффекта стиля MDI, вам также нужно настроить стиль окна, чтобы сделать его максимальным и удалить строку заголовка.

вот некоторые простой пример кода, где у меня есть форма с кнопкой и панелью:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; namespace WindowsFormsApplication2 < public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Process p = Process.Start(«notepad.exe»); Thread.Sleep(500); // Allow the process to open it’s window SetParent(p.MainWindowHandle, panel1.Handle); >[DllImport(«user32.dll»)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); > >

Читайте также:
Как удалить вредоносные программы на Айфон

Я только что видел еще один пример, где вместо того чтобы спать, они вызвали WaitForInputIdle. Таким образом, код будет выглядеть так:

Process p = Process.Start(«notepad.exe»); p.WaitForInputIdle(); SetParent(p.MainWindowHandle, panel1.Handle);

проект кода имеет хорошую статью Один весь процесс:хостинг EXE-приложений в проекте WinForm

автор: Luke Quinane

  • добавление некоторого решения в ответ..**

этот код помог мне закрепить некоторые исполняемые файлы в windows form. как блокнот, Excel, word, Acrobat reader и многое другое.

но это не будет работать для некоторых приложений. Как иногда, когда вы запускаете процесс некоторого приложения. ждите простоя. и попытайтесь получить свое главное окно. до тех пор, пока дескриптор главного окна не станет null.

Итак, я сделал один трюк, чтобы решить это

если вы получаете дескриптор главного окна как null. затем найдите все процессы выполнения на sytem и найдите процесс. затем получите основной hadle процесса и панель set в качестве его родителя.

ProcessStartInfo info = new ProcessStartInfo(); info.FileName = «xxxxxxxxxxxx.exe»; info.Arguments = «yyyyyyyyyy»; info.UseShellExecute = true; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Maximized; info.RedirectStandardInput = false; info.RedirectStandardOutput = false; info.RedirectStandardError = false; System.Diagnostics.Process p = System.Diagnostics.Process.Start(info); p.WaitForInputIdle(); Thread.Sleep(3000); Process[] p1 ; if(p.MainWindowHandle == null) < ListarrString = new List(); foreach (Process p1 in Process.GetProcesses()) < // Console.WriteLine(p1.MainWindowHandle); arrString.Add(Convert.ToString(p1.ProcessName)); >p1 = Process.GetProcessesByName(«xxxxxxxxxxxx»); //p.WaitForInputIdle(); Thread.Sleep(5000); SetParent(p1[0].MainWindowHandle, this.panel2.Handle); > else
автор: Saurabh Raoot

еще одно интересное решение для luch exeternal приложения с контейнером WinForm является следующее:

[DllImport(«user32.dll»)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); private void Form1_Load(object sender, EventArgs e)

шаг ProcessWindowStyle.Minimized из ProcessWindowStyle.Нормальное удаление раздражающей задержки.

enter image description here

автор: daniele3004

Если вы хотите запустить Блокнот внутри вашего приложения, вы, вероятно, будет лучше с компонентом текстового редактора. Очевидно, основной текст, что для WinForms, но я подозреваю, что более продвинутые компоненты, которые предлагают функциональность блокнота (или лучше) можно найти в интернете.

автор: Steve Haigh

Я знаю, что это возможно, если другое приложение может прикрепиться к дескриптору окна win32. Например, у нас есть отдельное приложение c#, которое размещает приложение DirectX внутри одного из своих окон. Я не знаком с точными деталями того, как это реализовано, но я думаю, что просто передаю win32 Handle вашей панели для другого приложения достаточно, чтобы это приложение прикрепило свою поверхность DirectX.

автор: Anthony Brien

Я замечаю, что все предыдущие ответы используют более старые функции библиотеки пользователей Win32 для достижения этого. Я думаю, что это будет работать в большинство случаи, но будут работать менее надежно с течением времени.

теперь, не сделав этого, я не могу сказать вам, насколько хорошо это будет работать, но я знаю, что текущая технология Windows может быть лучшим решением:рабочий стол Windows Manager API.

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

Я думаю, что вероятная проблема, которая может возникнуть, когда вы заставляете приложение быть дочерним родительским окном, которое не является окном рабочего стола, заключается в том, что некоторые разработчики приложений будут делать предположения о контексте устройства (DC), положении указателя (мыши), ширине экрана и т. д., который может вызвать неустойчивое или проблемное поведение, когда он «встроен» в основной окно.

Я подозреваю, что вы можете в значительной степени устранить эти проблемы, полагаясь на DWM, чтобы помочь вам управлять переводами, необходимыми для надежного представления окон приложения и взаимодействия с ними внутри окна контейнера другого приложения.

Источник: askdev.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru