Я ведь это уже делал, но хрен теперь найдешь тот кусок кода, гуглим снова… Где бы найти простое и понятное руководство для начинающего, а не тонкости для мега-гуру?
Главная→C#→ Как запустить другую программу/исполняемый .exe файл из кода C#
Рубрики
Свежие записи
- Вырезаем числовую часть из начала строки в transact-sql
- Пул соединений с базой данных в ADO.NET / OleDb — как избежать проблем с утечкой соединений в ASP.NET (перевод)
- ASP .Net MVC, JQuery и AJAX — отсылаем данные на сервер
- Разделитель тысяч и дробной части для decimal
- Создаем расширенный Control в WinForms наследуясь от существующего
- Вставка строк и изменение границ ячеек в Excel Interop из C#
- Как прочитать данные из удаленного DataRow в DataTable
- Проблемы с кодировкой при копировании русского текста из MS SQL Studio в Outlook/Word/Office
- Как проверить, существует ли таблица в MS SQL Server перед удалением/созданием
- Очень просто.
- Получаем выбранные строки DataGridView, в котором выбраны только ячейки
- Ошибка в коде привела к убыткам в 476 миллионов долларов и банкротству компании
- Отслеживаем изменения выбранного значения в колонке ComboBox DataGridView (DataGridViewComboBoxColumn)
- Excel 2010, Windows 7, два монитора и «ошибка при направлении команды приложению»
- Удаляем default-ограничение (constraint) в Transact Sql
Свежие комментарии
- Kirill к записи Самоучитель по C# для начинающих. 01. Основы языка, переменные, логика, циклы.
- как избавиться от чувства вины к записи Как добавить строку/текст в начало файла в C# и .Net
- DannyLef к записи Полезные расширения-плагины для WordPress
- как избавиться от чувства вины к записи Как добавить строку/текст в начало файла в C# и .Net
- gweg2ehgwEHERWQHQ к записи Простейшее диалоговое окно-вопрос (MessageBox) в WindowsForms
Архивы
Мета
Как запустить другую программу/исполняемый .exe файл из кода C#
Опубликовано 23.09.2011 автором Ведомир
Как скачать Visual C++ все распространяемые компоненты (VC++ Redistributable)
Задача: из программы на C# запустить другую программу (исполняемый файл). В теории все просто
System.Diagnostics.Process.Start(pathToFileString);
Но есть нюанс, если запускаемая программа находится в другом каталоге и использует для получения инофрмации о текущем каталоге функцию Directory.GetCurrentDirectory, то она получит вместо собственного каталога каталог исходной программы, из которой и запускается второй исполняемый файл.
Вылечить это можно двумя способами.
1) Использовать для получения каталога с исполняемым файлом функцию GetCurrentDirectory несколько неправильно, так как ее значение может расходится с каталогом программы, лучше использовать Application.StartupPath.
2) Если надо поддерживать совместимость со старым/чужим кодом или вообще запускать чужой исполняемый файл, мы можем вручную переопределить рабочий каталог запускаемой программы с использованием класса информации о процессе ProcessStartInfo
Как компилировать C/C++ в Visual Studio Code на Windows?
using System.Diagnostics; //. какой-то код. ProcessStartInfo infoStartProcess = new ProcessStartInfo(); infoStartProcess.WorkingDirectory = pathToDirectory; infoStartProcess.FileName = pathToFileString; Process.Start(infoStartProcess);
Комментарии
Как запустить другую программу/исполняемый .exe файл из кода C# — Комментарии (7)
вася говорит 09.04.2013 в 13:07 :
Спасибо за инфу
qwinmen говорит 16.03.2014 в 15:33 :
А возможно запустить exe на Си из программы на C#? Например, запускаем exe на С#, в нем стартует прописанный exe на Си — результат сохранить в .тхт, и прочитать этот .тхт из exe C#. Си(кансоль)\C#(окна)
Ведомир говорит 16.03.2014 в 15:48 :
Все исполняемые файлы двоичные, на каком бы языке они ни были написаны. Так что разницы не должно быть. По идее попробовать экспериментально выйдет быстрее чем писать вопрос. ))
Alkashka говорит 24.07.2014 в 7:03 :
А как при таком запуске отследить, работает ли запущенное приложение или закончило работу?
xoplay676 говорит 23.02.2018 в 11:31 :
Куда писать приложение которое я хочу запустить?
Источник: nullpro.info
Передача аргументов в программу
Бывает, что данные в программу передаются из командной строки при ее вызове. Такие данные называются аргументами командной строки. Выглядит это так, например:
./a.out test.txt ls -lt /home/peter/
Здесь вызываются программы a.out (из текущего каталога) и ls (из одного каталога, указанного в переменной окружения PATH). Первая программа из командной строки получает одно слово — test.txt, вторая — два: -lt и /home/peter/.
Если программа написана на языке C, то при ее запуске управление сразу передается в функцию main() , следовательно, именно она получает аргументы командной строки, которые присваиваются ее переменным-параметрам.
До этого мы определяли функцию main() так, как-будто она не принимает никакие параметры и ничего не возвращает. На самом деле в языке C любая функция по-умолчанию (если не определено ничего иного) возвращает целое число. В этом можно убедиться. Если записать код таким образом:
main() { printf(«Hin»); return 0; }
, то ошибки при компиляции не возникнет (но будет предупреждение). То же самое будет, если записать int main() . Это доказывает, что функция по-умолчанию возвращает целое число, а не ничто ( void ). Хотя то, что возвращает функция всегда можно «переопределить», например, voidmain() или float main() .
При вызове программы из командной строки в нее всегда передается пара данных:
- целое число, обозначающее количество слов (элементов, разделенных пробелами) в командной строке при вызове,
- указатель на массив строк, где каждая строка — это отдельное слово из командной строки.
Само имя программы также считается. Например, если вызов выглядит так:
./a.out 12 theme 2
, то первый аргумент программы имеет значение 4, а массив строк определяется как .
Обратите внимание на терминологию, есть всего два аргумента программы (число и массив), но сколько угодно аргументов командной строки. Аргументы командной строки «преобразуются» в аргументы программы (в аргументы функции main() ).
Эти данные (число и указатель) передаются в программу даже тогда, когда она просто вызывается по имени без передачи в нее чего-либо: ./a.out. В таком случае первый аргумент имеет значение 1, а второй указывает на массив, состоящий всего из одной строки .
То, что в программу передаются данные, вовсе не означает, что функция main() должна их принимать. Если функция main() определена без параметров, то получить доступ к аргументам командной строки невозможно. Хотя ничего вам не мешает их передавать. Ошибки не возникнет.
Чтобы получить доступ к переданным в программу данным, их необходимо присвоить переменным. Поскольку аргументы сразу передаются в main() , то ее заголовок должен выглядеть таким образом:
int main(int n, char *arr[])
В первой переменной (n) содержится количество слов, а во второй — указатель на массив строк. Часто второй параметр записывают в виде **arr . Однако это то же самое. Вспомним, что сам массив строк, содержит в качестве своих элементов указатели на строки. А в функцию мы передаем указатель на первый элемент массива. Получается, что передаем указатель на указатель, т.е. **arr .
Напишите такую программу:
#include int main(int argc, char **argv) { int i; printf(«%dn», argc); for (i=0; i argc; i++) puts(argv[i]); }
Она выводит количество слов в командной строке при ее вызове и каждое слово с новой строки. Вызовите ее без аргументов командной строки и с аргументами.
В программе мы использовали переменные-параметры argc и argv. Принято использовать именно такие имена, но на самом деле они могут быть любыми. Лучше придерживаться этого стандарта, чтобы ваши программы были более понятны не только вам, но и другим программистам.
Практическое значение передачи данных в программу
Если у вас есть опыт работы в командной строке GNU/Linux, вы знаете, что у большинства команд есть ключи и аргументы. Например, при просмотре содержимого каталогов, копировании, перемещении в качестве аргументов указываются объекты файловой системы, над которыми выполняется команда. Особенности ее выполнения определяются с помощью ключей. Например, в команде
cp -r ../les_1 ../les_101
cp — это имя команды, -r — ключ, а ../les_1 и ../les_101 — аргументы команды.
Нередко в программы при их запуске передаются адреса файлов и «модификаторы» (это ключи) процесса выполнения программы.
Напишем программу, которая открывает указанные пользователем в командной строке файлы на запись или добавление и записывает (добавляет) туда одну и туже информацию, которую пользователь вводит с клавиатуры в процессе выполнения программы:
#include #include int main (int argc, char **argv) int i, ch; FILE *f[5]; if (argc 3 if (strcmp(argv[1], «-w») != 0 strcmp(argv[1], «-a») != 0) { puts(«Первый параметр -w или -a»); return 2; } for (i=0; i argc-2; i++){ f[i] = fopen(argv[i+2], argv[1]+1); if (f[i] == NULL) { printf(«Файл %s нельзя открытьn», argv[i+2]); return 3; } } while ((ch = getchar()) != EOF) for (i=0; i argc-2; i++) putc(ch,f[i]); for (i=0; i argc-2; i++) fclose(f[i]); return 0; }
Пояснения к коду:
- Создается массив из пяти файловых указателей. Следовательно можно одновременно открыть не более пяти файлов. Файловый указатель первого файла будет хранится в элементе массива f[0], второго — в f[1] и т.д.
- Проверяется количество аргументов командной строки. Их должно быть не меньше трех, т.к. первый — это имя программы, второй — режим открытия файла, третий — первый или единственный файл, в который будет производится запись. Поскольку программа позволяет открыть только пять файлов, то общее число аргументов командной строки не может быть больше семи. Поэтому если количество аргументов меньше 3 или больше 7, то программа завершается, т.к. оператор return приводит к выходу из функции, даже если после него есть еще код. Возвращаемое из функции значение неравное 0, может быть интерпретировано родительским процессом, как сообщение о том, что программа завершилась с ошибкой.
- Проверяется корректность второго аргумента командной строки. Если он не равен ни «-w», ни «-a», то условное выражение во втором if возвращает 1 (true). Функция strcmp() позволяет сравнивать строки и возвращает 0 в случае их равенства.
- В цикле for открываются файлы по указанным адресам, которые начинаются с третьего элемента массива argv. Именно поэтому к i прибавляется 2, чтобы получать элементы массива argv, начиная с третьего. Выражение argc-2 указывает на количество переданных имен файлов; т.к. в argc хранится общее число аргументов командной строки, первые два из которых не являются именами файлов.
- Выражение argv[1]+1 позволяет «вырезать» из строки «-w» (или «-a») подстроку «w» (или «a»), т.к. argv[1] по сути указатель на первый элемент строки. Прибавляя к указателю единицу, мы смещаем его к следующему элементу массива.
- Если файл отрыть не удается, то функция fopen() возвращает NULL. В таком случае программа завершается.
- Каждый символ, введенный пользователем с клавиатуры, записывается во все открытые файлы.
- В конце файлы закрываются.
Источник: younglinux.info
Как открыть программу с CreateProcess, если известно только ее имя?
Как и в следующем примере, я пытаюсь запустить браузер Googles Chrome из приложения Windows, используя функцию Windows API CreateProcess.
У меня проблема в том, что я не знаю путь к приложению Chrome (или любому другому приложению в пути Программы). Как я могу получить это?
В приведенном ниже коде я прокомментировал три разных примера. Если я запускаю «calc», калькулятор запускается так же, как и в пути Windows / System32. Если я запускаю Chrome с полным путем к приложению, оно тоже запускается. Но если я пропущу путь и просто попробую запустить «chrome», я получу ошибку # 2.
#include #include #include void _tmain() < char* cmd = «calc»; // works. calc.exe is in windows/system32 // char* cmd = «chrome»; // doesn’t work. how can I add the path if it’s not known (e.g. windows installed on D:) // char* cmd = «c:/program files (x86)/google/chrome/application/chrome»; // works (even without extension .exe) STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( si.cb = sizeof(si); ZeroMemory( // Start the child process. if (!CreateProcess(NULL, // No module name (use command line) cmd, // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent’s environment block NULL, // Use parent’s starting directory pi) // Pointer to PROCESS_INFORMATION structure ) < printf(«CreateProcess failed (%d).n», GetLastError()); return; >// Wait until child process exits. WaitForSingleObject(pi.hProcess, INFINITE); // Close process and thread handles.
CloseHandle(pi.hProcess); CloseHandle(pi.hThread); >
Примечание: если я введу «chrome» (без кавычек) в командном окне Windows Run, Chrome также запустится. То, что я ищу, это та же функциональность. Однако мое приложение может находиться где угодно и не обязательно находится на том же диске, что и Chrome.
Решение
Если вы действительно должны использовать CreateProcess тогда вам нужно будет узнать, где он установлен и передать полный путь к исполняемому файлу. Это потребует взлома реестра.
Однако я чувствую, что есть более простой и надежный способ. Chrome регистрируется в AppPaths реестр так ShellExecuteEx с файлом, указанным как L»chrome» и глагол по умолчанию сделает работу.
Другие решения
Скорее всего, это не связано с WinAPI и CreateProcess функция, но только для переменной среды PATH , По умолчанию он содержит путь для всех стандартных команд Windows, таких как calc или же notepad , но вы должны добавить путь для других команд, которые вы добавите позже, будь то в Program Files или где-либо еще.
- внимательно обратите внимание на фактический путь chrome
- откройте Панель управления / Система / Дополнительные параметры системы
- щелкните Переменные среды: вы найдете путь (регистр не имеет значения) в пользовательских и системных переменных.
- добавить путь для chrome на одном (система предназначена для всех пользователей)
Теперь должна быть возможность запуска Chrome без указания полного пути.
NB: неуверен в фактических ярлыках для всего вышеперечисленного, моя коробка говорит по-французски …
Источник: web-answers.ru