Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798

Как запусть несколько программ нажатием на кнопку?

26.01.2011, 18:02. Показов 2500. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет друзья. Вопрос, может быть тривиальный, но я снова не могу найти решения. Задача: Запустить через нажатие на кнопку несколько приложений(две, три, ..., пять программ). Но особенность задачи такова, что нужно последующие утилиты, запускать только после того как отработает предыдущая. Я не знаю как как это сделать правильно. Вот что смог сделать, но запуск идёт поочерёдный линейный. Помогите с решением вопроса.
C++
1
2
3
4
5
6
7
8
9
10
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
   String Res1 = ExtractFilePath(Application->ExeName) + "Папка1\\Программа1.exe";
   WinExec(Res1.t_str(), 1);
   String Res2 = ExtractFilePath(Application->ExeName) + "Папка2\\Программа2.exe";
   WinExec(Res2.t_str(), 1);
   Close();
}
//---------------------------------------------------------------------------
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2011, 18:02
Ответы с готовыми решениями:

Как уничтожить несколько одинаковых объектов на сцене одним нажатием на кнопку?
Постоянно на сцене генерируются одинаковые объекты. При нажатии на кнопку нужно, чтобы (1)они все уничтожались/либо (2)уничтожалось...

Как нажать кнопку, нажатием другой?
У меня такая проблема у меня имеются 2 кнопки speedbutton. При нажатии первой, вторая принимает значение visible=false, и наоборот при...

как нажатием на кнопку запустить установку приложения из папки?
Всем привет :) Вопрос такой - запускаю приложение там есть кнопка "установить новую версию"(файл 111.apk к примеру находится на СД...

10
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
26.01.2011, 18:56
Maestro, такое можно сделать через командную строку вот так:
C++
1
2
3
4
5
void __fastcall TForm1::Button1Click(TObject *Sender)
{
system("F:\\load.bmp & F:\\dyuma_aleksandr18.zip");
}
//---------------------------------------------------------------------------
Передавать имена программ, которые надо запустить, через &.

Добавлено через 16 минут
Или вот так. В этом случае окно командной строки будет скрыто:
C++
1
ShellExecute(0,"open","cmd.exe","/c F:\\load.bmp & F:\\dyuma_aleksandr18.zip","C:\\Windows\\system32\\",SW_HIDE);
Добавлено через 2 минуты
Ну или отслеживать хендл запускаемых приложений и прочие сложные вещи.

Добавлено через 13 секунд
Все, идеи кончились.
2
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
26.01.2011, 19:17  [ТС]
NiTan, Пример действительно работает, но применить в деле на .exe файла у меня не получается. Можешь показать пример именно для исполнимых файлов с передачей параметров для одного из .exe? Вот мы получили путь к исполняемому файлу
C++
1
String Res1 = ExtractFilePath(Application->ExeName) + "Папка1\\Программа1.exe";
C:\Test\Папка1\Программа1.exe
C++
1
String Res2 = ExtractFilePath(Application->ExeName) + "Папка2\\Программа2.exe";
C:\Test\Папка2\Программа2.exe

Как дальше их передать правильно функции?
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
26.01.2011, 20:15
Maestro, при запуске через командную строку нужно все пробелы, которые содержатся внутри пути к файлу заключать в кавычки, но так как запускаем мы из Билдера, то эти кавычки нужно еще и экранировать. Получается, что, к примеру, для запуска программы из папки Program Files нужно написать следующее:
C++
1
ShellExecute(0,"open","cmd","/c C:\\Program\" \"Files\\CCleaner\\CCleaner.exe","C:\\Windows\\system32\\",SW_SHOW);
Здесь пробел выделен кавычками, которые при этом экранированы. Возможно, поэтому у тебя и не получилось запускать программы.

Цитата Сообщение от Maestro Посмотреть сообщение
показать пример именно для исполнимых файлов с передачей параметров для одного из .exe
Чтобы передать параметр запускаемой программе, нужно дописать его (параметр) к имени файла через пробел (каждый отдельный параметр тоже, вроде, пишется через пробел):
C++
1
ShellExecute(0,"open","cmd","/c C:\\Program\" \"Files\\CCleaner\\CCleaner.exe param1","C:\\Windows\\system32\\",SW_SHOW);
В данном случае, param1 уже считается параметром.

Добавлено через 3 минуты
Лучше, конечно, чтобы в пути к файлам не было пробелов и русских символов - так на много легче.

Добавлено через 3 минуты
Параметр /c который постоянно присутствует в начале команды говорит о том, что после выполнения всех инструкций командная строка будет закрыта. Если этого не нужно, то /c можно заменить на /k.
2
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
26.01.2011, 21:00
Лучший ответ Сообщение было отмечено как решение

Решение

Maestro, для того, чтобы дождаться завершения запущенного приложения необходимо воспользоваться функцией WaitForSingleObject.
Объявите вот такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool __fastcall StartProgram(const String &Program, const String &Params = "", bool WaitForTerminate = false)
{
  STARTUPINFO st_info;
  ZeroMemory(&st_info, sizeof(st_info));
  st_info.cb = sizeof(st_info);
  PROCESS_INFORMATION pi;
  ZeroMemory(&pi, sizeof(pi));
  bool Result = (CreateProcessW(NULL, (L"\"" + Program + L"\" " + Params).w_str(), NULL, NULL, false, 0, NULL, NULL, (LPSTARTUPINFOW)&st_info, (LPPROCESS_INFORMATION)&pi) != 0);
  if (Result) {
    Result = (!WaitForTerminate) || (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_OBJECT_0);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  }
  return Result;
}
И используйте её следующим образом:
C++
1
2
StartProgram(L"mspaint",L"",true);
StartProgram(L"calc",L"",true);
Учтите, что после запуска одного приложения программа не будет продолжать своё выполнение до тех пор, пока запущенное приложение не будет полностью разрушено (если параметр WaitForTerminate имеет истинное значение).

Не по теме:

Если у вас старая версия IDE, не поддерживающая юникод - замените метод w_str() и уберите макрос L

3
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
27.01.2011, 14:05  [ТС]
MikeSoft, Всё работает зашибенно! Благодарю.

Ребят, вопрос ещё вот в чём, на Windows XP где права администратора включены по умолчанию всё ок, а на Windows Vista и Windows 7 нужен запуск утилит от имени администратора, здесь без вариантов.

Как программно сделать так чтобы на этих системах, висте и семёрке производился запуск утилит с правами\от имени администратора?
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
27.01.2011, 14:54
Цитата Сообщение от Maestro Посмотреть сообщение
Как программно сделать так чтобы на этих системах, висте и семёрке производился запуск утилит с правами\от имени администратора?
Никак, ибо это уже из разряда обхода безопасности ОС.
Если это и получится осуществить, то любой антивирус слёту заблокирует такое ПО.
1
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
27.01.2011, 15:22  [ТС]
MikeSoft, Понятно, а как же вроде бы есть какой-то манифест, который позволяет сразу запустить программу от имени администратора, что ли? Я извиняюсь, может быть за неверно поставленные вопросы, у меня Windows XP.
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
27.01.2011, 21:12
Maestro, скорее не "сразу запустить программу от имени администратора", а "требовать вызова контролёра учётных записей".
Посмотрите вот это: Админские права. Возможно, чем-то поможет
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.01.2011, 00:08
Цитата Сообщение от Maestro Посмотреть сообщение
[b]есть какой-то манифест
- если вы про висту/вин7, то вот -
http://www.k-press.ru/cs/2008/2/UAC/uac.asp
http://www.interface.ru/home.asp?artId=21156
обсуждалось недавно в одной из соседних тем.
1
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
02.03.2011, 21:08  [ТС]
Привет ещё раз, думаю, мой вопрос можно отнести к этой теме.

Есть такая консольная утилита - Handle Руссиновича.

Нужно посредством кнопки, запустить эту утилиту с параметрами\ключами и сохранить результаты в лог log.txt. Как выполнить этот запуск с ключами программно?

Code
1
handle.exe -a | find "Mutant" > log.txt
Код приведённый MikeSoft, немного подогнаный под C++ Builder 6.0. Не могу понять, почему не срабатывает? Мне кажется что передача параметров у меня происходит не верно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   String Res1 = ExtractFilePath(Application->ExeName) + "handle.exe";
   StartProgram(Res1, "-a | find \"Mutex\" > log.txt", true);
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::StartProgram(const String &Program, const String &Params, bool WaitForTerminate)
{
  STARTUPINFO st_info;
  ZeroMemory(&st_info, sizeof(st_info));
  st_info.cb = sizeof(st_info);
  PROCESS_INFORMATION pi;
  ZeroMemory(&pi, sizeof(pi));
  bool Result = (CreateProcess(NULL, ("\"" + Program + "\" " + Params).c_str(), NULL, NULL, false, 0, NULL, NULL, (LPSTARTUPINFO)&st_info, (LPPROCESS_INFORMATION)&pi) != 0);
  if (Result) {
    Result = (!WaitForTerminate) || (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_OBJECT_0);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  }
  return Result;
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2011, 21:08
Помогаю со студенческими работами здесь

Как создать файл в папке, созданной нажатием на кнопку
Здравствуйте! В поиске не нашел) При клике button происходит - создание в папке System подпапки с именем из выбранной строки в...

Как сделать обработку текста перед нажатием на кнопку?
Есть форма в ней поле #textTexarea в нем ведется редактирование текста. В форме прописано action на файл. Так вот как мне сделать так, что...

Как добавить нажатием кнопки несколько инпутов
Доброе утро, форумчане! Подскажите как можно добавить одним нажатием на кнопку допустим N инпутов.

Как посчитать время между прорисовкой объекта и нажатием на кнопку?
Пишу первое приложение WinAPI без ООП в среде CodeBlocks. Необходимо засечь время между прорисовкой объекта (в case WM_PAINT: ) в окне и...

Возврат объекта после drag-and-drop, нажатием на кнопку. Как?
необходимо организовать возврат объектов на их исходные места, после их перетаскивания. Осуществить все необходимо отдельной кнопкой....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru