Вычислительная машина ценна ровно настолько, насколько ценен использующий её человек. Но он обязан иметь идеи. Норберт Винер. «Кибернетика, или Управление и связь в животном и машине».
пятница, 16 мая 2014 г.
Вызов внешней программы из приложения C#
В практике программирования бывает возникает необходимость вызова из приложения некоторой внешней программы возможно с передачей ей списка аргументов. В C# эта задача решается средствами System.Diagnostics.Process . Приведу небольшой пример, показывающий имеющиеся в распоряжении программиста возможности.
В одном из C# проектов мне требовалось перемещать каталог со всем его содержимым из одного места в другое. В рамках одного тома с этой задачей успешно справлялся статический класс System.IO.Directory и его метод Move() . Однако перемещать между разными томами он отказывался, генерируя исключение. Я вспомнил, что в Windows есть утилита командной строки с до боли знакомым названием XCOPY, которая умеет копировать как файлы так и целые каталоги и имеет приличный набор аргументов управляющих разными аспектами ее поведения. При перемещении каталога из одного места в другое между разными томами надо сначала источник скопировать, и только затем приступать к его удалению. Первый этап реализуется совсем просто. Сначала создаем новый процесс
Передача параметров в функцию по указателю c++. Передача указателя в функцию си. Урок #48
var proc = new System.Diagnostics.Process();
Далее, задаем имя программы которую необходимо запустить на исполнение
proc.StartInfo.FileName = «XCOPY»;
и указываем аргументы если таковые имеются
proc.StartInfo.Arguments = ‘»‘ + pathSrc + ‘»‘ + » » + ‘»‘ + pathDest + ‘»‘ + » /e /c /Y /I»;
В данном случае параметр pathSrc — это каталог источник, pathDest — каталог приемник, и каждый из них обрамлен кавычками. Далее идут аргументы, управляющие поведением XCOPY, а именно — копировать каталог с подкаталогами включая пустые, продолжать копировать вне зависимости от наличия ошибок, подавлять запрос подтверждения на перезапись существующего целевого файла. Последний аргумент предписывает трактовать целевой объект как каталог и позволяет подавить неудобный запрос утилиты перед началом процесса копирования, если целевой объект не существует.
Определившись с аргументами, можно дополнительно избавиться от окна командного процессора, установив стиль окна
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Запуск процесса осуществляет метод
который выполняется в неблокирующем режиме. Этот вызов однако может доставить определенную проблему, если вызывающему коду надо реагировать на момент завершения процесса. Поймать отпущенный на свободу процесс за хвост можно через функцию обратного вызова, которую задают перед вызовом Start()
proc.EnableRaisingEvents = true;
proc.Exited += new EventHandler(XMovePathExited);
Сигнатура функции соответствует стандартному обработчику void EventHandler(object sender, EventArgs e) .
ОКОННОЕ ПРИЛОЖЕНИЕ С НУЛЯ — ПОЛНЫЙ БАЗОВЫЙ КУРС C++ WINAPI
Запустить новый процесс можно и в блокирующем режиме, для этого достаточно после Start() вызвать proc.WaitForExit() .
Источник: lab119.blogspot.com
WinExec – запуск любого приложения или файла
Функция WinExec() позволяет запустить из окна запускаемого приложения любое указанное приложение. WinExec() совместима с 32-битной Windows и с более ранними версиями, и может запускать любые файлы приложений Windows, MS-DOS и PIF (Program Information File).
Синтаксис
int WinExec(const char *CmdLine, unsigned int CmdShow);
Параметры
- CmdLine – это указатель на строку или командная строка, содержащая имя запускаемого файла с необязательными параметрами. При указании только имени файла без пути его расположения, то Windows начнёт его поиск в следующей последовательности:
- Каталог, в котором было запущено приложение.
- Текущий каталог.
- Каталог системного раздела Windows с помощью функции GetSystemDirectory.
- Каталог Windows с помощью функции GetWindowsDirectory.
- С помощью окружения PATH, содержащий список каталогов.
- CmdShow – задаёт вариант отображения запускаемого приложения Windows и имеет множества значений.
SW_HIDE |
Скрывает указанное окно приложения. |
SW_SHOWNORMAL SW_NORMAL 1 |
Отображает окно приложения и делает его активным. При отображении восстанавливается исходный размер и положение. |
SW_SHOWMINIMIZED 2 |
Сворачивает в трей окно приложения и делает его активным. |
SW_SHOWMAXIMIZED SW_MAXIMIZE 3 |
Разворачивает и делает активным окно приложения. |
SW_SHOWNOACTIVATE 4 |
Отображает окно приложения с его последним размером и положением. |
SW_SHOW 5 |
Отображает окно приложения и делает его активным с последним размером и положением. |
SW_MINIMIZE 6 |
Сворачивает в трей окно приложения и делает активным следующее по порядку. |
SW_SHOWMINNOACTIVE 7 |
Отображает окно приложения в свёрнутом виде. |
SW_SHOWNA 8 |
Отображает окно приложения в его текущем положении и размере. |
SW_RESTORE 9 |
Отображает окно приложения и делает его активным. При отображении восстанавливается исходный размер и положение. |
SW_SHOWDEFAULT 10 |
Задаёт параметры по умолчанию, указанные в структуре STARTUPINFO, передаваемые функцией CreateProcess(). |
SW_FORCEMINIMIZE 11 |
Сворачивает в трей окно приложения, если даже его поток не отвечает. |
Возвращаемое значение
При успешном завершении функции WinExec(), она возвращает значение больше 31.
В случае сбоя, WinExec() возвращает одно из значений:
Нехватка ресурсов системы или памяти. | ||
ERROR_FILE_NOT_FOUND | 2 | Запускаемый файл не найден или не существует. |
ERROR_PATH_NOT_FOUND | 3 | Указанный каталог не существует. |
ERROR_BAD_FORMAT | 11 | Ошибка в запускаемом файле .exe |
Примечание
WinExec() имеет достоинство: она совместима с ранними версиями Windows. Начиная с Win32, рекомендуется использовать функцию CreateProcess().
Пример запуска программы
WinExec() запускает программу «cubook.exe» с параметром SW_RESTORE.
WinExec(«cubook.exe», SW_RESTORE);
Пример запуска MS-DOS
WinExec(«COMMAND.COM», SW_RESTORE); //Запуск командной строки
Источник: cubook.pro
Запуск внешних процессов в C#
Небольшая заметка о том, как в C# запускать сторонние приложения и дожидаться их завершения. Для вызова внешних программ в C# используется класс System.Diagnostics.Process .
Для запуска нового процесса нужно его методу Start передать имя запускаемого файла: Process p = Process.Start(«explorer»); Если запуск нового процесса — это все, что Вам нужно, то дальше можете и не читать. А если Вам нужно дождаться завершения процесса и выполнить после этого некоторые действия, то нужно вызвать метод WaitForExit() нового процесса:
p.WaitForExit(); // Ожидаем завершения процесса Console.WriteLine(«Process exited»);
Вышеупоммянутый код полностью останавливает приложение на время работы вызываемой программы. Если это не нужно, то можно привязать к процессу обработчик его завершения, и пока он работает заниматься своими делами:
Process p = new Process(); ProcessStartInfo info = new ProcessStartInfo(«explorer»); p.StartInfo = info; // привязываем обработчик завершения процесса p.Exited += new EventHandler(processExited); p.EnableRaisingEvents = true; p.Start(); Console.WriteLine(«Process started»);
Просмотр 0 веток ответов
- Для ответа в этой теме необходимо авторизоваться.
Источник: pro-prof.com