Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 21.08.2015
Сообщений: 3
RAD 2009-XE3

Запуск WinRar с параметрами через CreateProcess

24.01.2020, 11:38. Показов 3338. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Подскажите пожалуйста как запустить WinRar с параметрами через CreateProcess.
Через ShellExecute делаю так и все работает:

C++
1
ShellExecute(Handle, "open", "C:/Program Files/WinRAR/WinRAR.exe", Parametr.t_str() , NULL, SW_SHOWNORMAL);
где Parametr содержит строку:
a -ep1 -ag_DD.MM.YY-HHMM "C:\Users\Andrey\Documents\RAD Studio\Projects\2019\Debug\Data\BackUp\b ackup.rar" "C:\Users\Andrey\Documents\RAD Studio\Projects\2019\Debug\Data\DataBase .mdb"

строка собирается переменными:

C++
1
2
3
4
String Path=ExtractFilePath(ParamStr(0));
String WayToBase=Path+"\Data\\DataBase.mdb";
String Res=Path+"\Data\\BackUp\\backup.rar";
String Parametr="a -ep1 -ag_DD.MM.YY-HHMM \""+Res+"\""+" "+"\""+WayToBaseT+"\"";
Через CreateProcess делаю так:

C++
1
2
CreateProcess("C:/Program Files/WinRAR/WinRAR.exe", Parametr.t_str(),
NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
WinRar запускается, но параметры не работают и выдает соответственно ошибку. Перечитал сегодня много инфы в инете, но так и не смог добиться результата((

Нужно сделать через CreateProcess, чтобы знать когда архивация закончена.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2020, 11:38
Ответы с готовыми решениями:

Запуск стороннего приложения через CreateProcess
Доброго времени суток! Есть два одинаковых консольных приложения, но с разными именами. Из первого вызывается второе следующей...

Запуск приложения через CreateProcess(), передать параметры запуска, указать тот же каталог
Здравствуйте, помогите побороться с CreateProcess() Есть рабочая программа, которая должна запустить независимый процесс. Запуск нужно...

Запуск через CreateProcess
Как запустить программу через CreateProcess и передать параметры запуска ? Если нужно исходник выложу!

6
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,405
Записей в блоге: 3
25.01.2020, 09:27
Лучший ответ Сообщение было отмечено Workgb2 как решение

Решение

Просто напутали с путями... Посмотрели бы, какую ошибку CreateProcess выдает - понятнее бы стало...
Ну и, как бы для консольной работы предназначена утилита rar.exe, а не winrar.exe...
Вот в таком вот виде у меня все заархивировалось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String EXE = "\"C:\\Program Files\\WinRAR\\RAR.exe\"",
   Res = String().sprintf(L"\"%sData\\BackUp\\backup.rar\"", ExtractFilePath(ParamStr(0))),
   WayToBase = String().sprintf(L"\"%sData\\DataBase.mdb\"", ExtractFilePath(ParamStr(0))),
   Parametr = String().sprintf(L"%s a -ep1 -ag_DD.MM.YY-HHMM %s %s", EXE, Res, WayToBase);
 
   STARTUPINFO si;
   ZeroMemory(&si, sizeof(STARTUPINFO));
   si.cb = sizeof(STARTUPINFO);
   PROCESS_INFORMATION pi;
   if(!CreateProcess(0, Parametr.c_str(), 0, 0, FALSE, 0, 0, 0, &si, &pi))
    {
      String s = String().sprintf(L"Can not create process (error %d)", GetLastError());
      Application->MessageBox(s.c_str(), L"Warning", MB_OK | MB_ICONEXCLAMATION);
      return;
    }
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
}
2
0 / 0 / 0
Регистрация: 21.08.2015
Сообщений: 3
27.01.2020, 09:24  [ТС]
Спасибо большое!
Только у меня ругается на Parametr.с_str():

[BCC32 Error] Unit1.cpp(877): E2034 Cannot convert 'wchar_t *' to 'char *'
Full parser context
Unit1.cpp(864): parsing: void _fastcall TForm1::AdvGlowButton10Click(TObject *)
[BCC32 Error] Unit1.cpp(877): E2342 Type mismatch in parameter 'lpCommandLine' (wanted 'char *', got 'wchar_t *')
Full parser context
Unit1.cpp(864): parsing: void _fastcall TForm1::AdvGlowButton10Click(TObject *)

С Parametr.t_str() работает.

Как я понял вот эта часть кода проверяет только ошибку запуска самого процесса:

C++
1
2
3
String s = String().sprintf(L"Can not create process (error %d)", GetLastError());
      Application->MessageBox(s.c_str(), L"Warning", MB_OK | MB_ICONEXCLAMATION);
      return;
А чтобы узнать завершение процесса архивации нужно добавить:

C++
1
2
3
4
DWORD ExitCode;
WaitForInputIdle(pi.hProcess, INFINITE);  //Ждем завершения инициализации.
WaitForSingleObject(pi.hProcess, INFINITE); //Ждем завершения процесса.
GetExitCodeProcess (pi.hProcess,&ExitCode); //Получаем код завершения.
Верно?
0
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,405
Записей в блоге: 3
27.01.2020, 10:35
Цитата Сообщение от Workgb2 Посмотреть сообщение
Только у меня ругается на Parametr.с_str():
А версия какая?
Цитата Сообщение от Workgb2 Посмотреть сообщение
проверяет только ошибку запуска самого процесса
Да, эта часть выводит сообщение о полученной ошибке функции CreateProcess(), если таковая имела место быть...
Я не уверен, надо ли использовать WaitForInputIdle(), надо посмотреть материалы, мне всегда хватало WaitForSingleObject()
0
0 / 0 / 0
Регистрация: 21.08.2015
Сообщений: 3
27.01.2020, 11:13  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
А версия какая?
Embarcadero® C++Builder® 2010 Version 14.0.3593.25826

Цитата Сообщение от D1973 Посмотреть сообщение
Я не уверен, надо ли использовать WaitForInputIdle(), надо посмотреть материалы, мне всегда хватало WaitForSingleObject()
Я просто тут нашел Запуск и ожидание закрытие через CreateProcess
0
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,405
Записей в блоге: 3
27.01.2020, 15:19
Цитата Сообщение от Workgb2 Посмотреть сообщение
C++Builder® 2010 Version 14.0.3593.25826
Старенькая, но юникод уже поддерживала... Странно... Возможно, надо посмотреть, что в настройках проекта в свойстве _TCHAR maps to выставлено. У меня-то стоит wchat_t, у Вас, видимо, char

Добавлено через 10 минут
Цитата Сообщение от Workgb2 Посмотреть сообщение
Я просто тут нашел
Посмотрите тут... Даже не взирая на обливания грязью оппонентов друг друга - есть что почерпнуть для начала...
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.02.2020, 00:20
Цитата Сообщение от D1973 Посмотреть сообщение
Я не уверен, надо ли использовать WaitForInputIdle(),
Это по сути ожидание готовности GUI обрабатывать ввод пользователя. Возвращается как правила чуть раньше чем появляется окно на экране при запуске программы.

Но самое простое в таймере проверять ExitCode что бы не вешать окна (если кишка тонка использовать потоки)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2020, 00:20
Помогаю со студенческими работами здесь

Запуск и ожидание закрытие через CreateProcess
Всем привет!! ребят подскажите!! я запускаю программу так param:='параметры запуска';...

Запуск приложения через CreateProcess и ожидание его завершения
В общем, суть в следующем: нужно, чтобы программа запускала консольное приложение DD под windows, передавала ему необходимые параметры, и...

Запуск через командную строку с параметрами
Помогите плиз!!! void main(int argc, char *argv) { int k,N; clrscr(); LIST *lst; FILE *fi,*fo; if (( fi =...

Запуск формы через командную строку с параметрами
Знаю, что в консоли можно получить данные из командной строки int main(int argc, char *argv) { // Инструкции return 0; } ...

Запуск SQL запросов с разными параметрами через консоль DB2
Добрый день. Сильными знаниями по автоматизации не обладаю. Простые батники это ладно, но тут встала интересная (для меня) задача. ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru