Существует несколько способов запуска одной программы из другой.
- WinExec — устаревшая функция, используется только для совместимости с 16-битной Windows. Не рекомендуется к использованию в Win32-приложениях.
- CreateProcess — замена WinExec для Win32.
BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
Параметры:
lpApplicationName | имя программы |
lpCommandLine | параметры командной строки |
lpProcessAttributes | атрибуты безопасности процесса (имеет смысл только в NT/2000) |
lpThreadAttributes | атрибуты безопасности главного потока (имеет смысл только в NT/2000) |
bInheritHandles | если bInheritHandles == TRUE, то созданный процесс (запущенная программа), наследует дескрипторы (handles) запускающей программы |
dwCreationFlags | параметры создания. Здесь можно указать класс приоритета создаваемого процесса и некоторые дополнительные параметры |
lpEnvironment | указатель на блок окружения или NULL, тогда используется блок окружения родителя |
lpCurrentDirectory | текущая директория или NULL, тогда используется текущая директория родителя |
lpStartupInfo | указатель на структуру STARTUPINFO, которая определяет положение главного окна |
lpProcessInformation | сюда будет записана информация о созданном процессе |
Пример запуска notepad.exe.
STARTUPINFO si; PROCESS_INFORMATION pi; GetStartupInfo( if(!CreateProcess( «c:\windows\notepad.exe», NULL, NULL, NULL, FALSE, 0, NULL, NULL, pi)) < // обработка ошибок >
HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );
Эта функция возвращает значение >32 в случае успешного выполнения и значение <= 32 в случае ошибки. Параметры:
hwnd | дескриптор родительского окна |
lpOperation | строка, описывающая операцию: «open» — открытие (запуск), «print» — печать, «explore» — открыть окно с заданной папкой |
lpFile | имя файла |
lpParameters | параметры командной строки |
lpDirectory | текущая директория для запускаемой программы |
nShowCmd | параметр, указывающий, как будет показано приложение при открытии. Имеет тот же смысл, что и nCmdShow в WinMain |
Пример запуска notepad.exe:
if((UINT)ShellExecute( NULL, «open», «notepad.exe», NULL, NULL, SW_SHOWNORMAL) 32) < // обработка ошибок >
WINSHELLAPI BOOL WINAPI ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo );
Формат структуры SHELLEXECUTEINFO:
typedef struct _SHELLEXECUTEINFO< DWORD cbSize; // размер структуры ULONG fMask; // маска, указывающая HWND hwnd; LPCTSTR lpVerb; // команда LPCTSTR lpFile; // имя файла LPCTSTR lpParameters; // параметры командной строки LPCTSTR lpDirectory; // текущая директория int nShow; // параметр, указывающий, как будет показано приложение при открытии. HINSTANCE hInstApp; // сюда будет записан hInstance приложения // Optional members LPVOID lpIDList; // IDL, определяющий файл для выполнения LPCSTR lpClass; // имя класса файла или GUID HKEY hkeyClass; // дескриптор ключа в реестре для класса файла DWORD dwHotKey; // горячая клавиша HANDLE hIcon; // иконка для класса файла HANDLE hProcess; // дескриптор процесса > SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;
Пример запуска notepad.exe: SHELLEXECUTEINFO SHExecInfo;
ZeroMemory( SHExecInfo.cbSize = sizeof(SHExecInfo); SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; SHExecInfo.nShow = SW_SHOWNORMAL; SHExecInfo.lpFile = «notepad.exe»; if(!ShellExecuteEx( // обработка ошибок >
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
Как закрепить игру или программу поверх всех окон
Копирование или перенос программ, паролей, логинов с андроида на андроид
Источник: www.rsdn.org
Связь двух проектов в одном решении?
У меня есть проекты консольного и оконного приложений в одном решении. Мне нужно запускать из формы консоль с нужными параметрами, и я надеялся, что один проект сможет обращаться к другому (например, знать путь до его исполняемого файла), но никакой разницы с одиночными проектами не вижу. Так же не понимаю, что дает зависимость одного от другого. В чем тогда смысл общего решения, или я делаю что-то не так?
- Вопрос задан более двух лет назад
- 901 просмотр
Комментировать
Решения вопроса 1
.NET developer (open to job offers)
Проекты в одном решении — как правило не взаимосвязаны между собой. Но если например, один проект — это библиотека dll, а второй исполняемый exe, то Вы можете подключить выходную библиотеку у исполняемого файла.
В этом случае можно одновременно «пилить» оба проекта.
Также может быть сложный проект, состоящий из нескольких исполняемых файлов. Например — программа для использования клиентом и административная панель.. Логично их объединить в одно решение. Если у этих проектов есть общие библиотеки, то их также можно добавить новыми проектами.
Собственно организацию взаимодействия нескольких проектов в одном решении Вы настраиваете сами.
Ответ написан более двух лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 1
Токсичный шарпист
Решение — это просто способ удобно сгруппировать несколько проектов. Оно нужно только для IDE.
Взаимосвязи между проектами делаются через PackageReference
Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- C#
- +2 ещё
В чем может быть проблема, если триггер срабатывает, когда объекты не соприкасаются в Unity 2D?
- 1 подписчик
- 3 часа назад
- 7 просмотров
Источник: qna.habr.com
Связывание элементов
Простейший сценарий привязки данных подразумевает ситуацию, когда исходным объектом является элемент WPF, а исходным свойством — свойство зависимости. Причина в том, что свойство зависимости имеет встроенную поддержку уведомлений об изменениях. В результате, когда значение свойства зависимости изменяется в исходном объекте, привязанное свойство целевого объекта немедленно обновляется. Это именно то, что требуется, и происходит оно без необходимости построения любой дополнительной инфраструктуры.
Хотя привязка элемента к элементу является простейшим подходом, большинство разработчиков заинтересовано в нахождении самого общего подхода для реальных приложений. В общем, большая часть работы по привязке данных будет тратиться на привязку элементов к объектам данных. Это позволит отображать информацию, извлекаемую из внешнего источника (такого как база данных или файл). Однако привязка элемента к элементу также часто бывает полезной.
Например, ее можно использовать для автоматизации способа, которым элементы взаимодействуют, так что когда пользователь модифицирует один элемент управления, другой элемент обновляется автоматически. Это ценное сокращение, которое избавляет от написания громоздкого и рутинного кода (и это прием, не доступный в предыдущем поколении приложений Windows Forms).
Чтобы понять, как привязывать один элемент к другому, рассмотрим простое окно. Оно содержит два элемента управления: Slider (ползунок) и TextBlock (текстовый блок) с единственной строкой текста. Перемещение ползунка вправо приводит к немедленному увеличению размера шрифта текста, а перемещение влево — к уменьшению размера шрифта.
Привязка определена в элементе TextBlock. Вместо установки FontSize с использованием литерального значения применяется выражение привязки.
Выражения привязки данных используют расширение разметки XAML (и потому помещаются в фигурные скобки). В начале идет слово Binding, потому что создается экземпляр класса System.Windows.Data.Binding. Хотя объект Binding может быть сконфигурирован различными способами, в данной ситуации необходимо установить только два свойства: ElementName, которое указывает исходный элемент, и Path, указывающее свойство в исходном элементе.
Вместо Property используется Path, потому что Path может указывать на свойство свойства (например, FontFamily.Source) или индексатор, используемый свойством (например, Content.Children[0]). Путь может включать множество фрагментов, переходящих от свойства к свойству, и т.д.
Чтобы сослаться на присоединенное свойство (свойство, которое определено в другом классе, но применяется к привязанному элементу), имя свойства должно быть указано в круглых скобках. Например, в случае привязки к элементу, помещенному в Grid, путь (Grid.Row) извлекает номер строки, в которой он находится.
Ошибки привязки
WPF не генерирует исключения для уведомления о проблемах привязки данных. Если указан несуществующий элемент или свойство, никакого сообщения об этом не будет; вместо этого данные просто не попадут в целевое свойство. На первый взгляд это может показаться кошмаром для отладки. К счастью, WPF выводит трассировочную информацию, которая детализирует сбои в привязке. Во время отладки приложения эта информация появляется в выходном окне Visual Studio.
Например, попытка привязки к несуществующему свойству приводит к выводу в выходное окно следующего сообщения:
Шаг с заходом: обход кода, не являющегося кодом пользователя «WpfApplication1.App.App» Шаг с заходом: обход кода, не являющегося кодом пользователя «WpfApplication1.App.InitializeComponent» System.Windows.Data Error: 40 : BindingExpression path error: ‘SliderValue’ property not found on ‘object’ »Slider’ (Name=’sld’)’ .BindingExpression:Path=SliderValue; DataItem=’Slider’ (Name=’sld’); target element is ‘TextBlock’ (Name=»); target property is ‘FontSize’ (type ‘Double’)
Среда WPF также игнорирует любые исключения, которые генерируются при попытке читать исходное свойство, и молча поглощает исключение, возникающее, если исходные данные не могут быть приведены к типу данных целевого свойства. Однако есть и другой способ справиться с этой проблемой — можно сообщить WPF о необходимости изменения внешнего вида исходного элемента для индикации возникшей ошибки. Например, неверный ввод можно пометить значком с восклицательным знаком или рамкой красного цвета.
Источник: professorweb.ru