Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/75: Рейтинг темы: голосов - 75, средняя оценка - 5.00
155 / 103 / 45
Регистрация: 30.11.2012
Сообщений: 1,136
1

Запуск программ из другой программы

12.09.2014, 14:58. Просмотров 13997. Ответов 12
Метки нет (Все метки)

Подскажите пожалуйста, что делаю не так.
Задача следующая: Есть несколько программ, которые нужно поочерёдно запускать и выполнять в них некоторые действия. Программы которые нужно запускать пользователь сам должен указать в txt файле конфигурации.

Столкнулся с проблемой, что программу путь к которой указан в файле не запускат нужную программу..

Ниже код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//Подключаем библиотеки
#include <iostream>
#include <ostream>
#include <clocale>
#include <conio.h>
#include <Windows.h> //для определения окна
#include <WinUser.h> //для определения окна
#include <ShellAPI.h> //для запуска процессов
#include <time.h>
#include <fstream>
#include <string> 
#include "shellapi.h"
 
using namespace std;
 
//Основной код программы
void main()
{
    setlocale(LC_CTYPE, "Russian"); //Руссификатор
    
    //переменные
    string s1; //Переменная будет считывать строку 
 
    //чтение из файла
    ifstream in ("C:\\1.txt"); //Открываем файл для считывания информации 
    in>>s1; //считываем строку
    in.close(); // Закрываем файл
 
    cout << "Запускаем: Программу 1 \n";
    ShellExecute (0, TEXT("open"), TEXT("",s1), NULL,NULL, SW_RESTORE); // Открыть файл 
    Sleep(2000);
    cout << ">> Выполняем некоторые действия в программе \n";
    Sleep(5000);    
 
    cout << "Запускаем: Программу 2 \n";
    ShellExecute (0, TEXT("open"), TEXT("1"), NULL,NULL, SW_RESTORE); // Открыть файл 
    Sleep(2000);
    cout << "Выполняем некоторые действия в программе 0\n";
    Sleep(5000);    
 
 
    cout << "Первоначальная прошивка завершена, перезагрузите плату и нажмите <<ENTER>>\n";
    getch(); 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2014, 14:58
Ответы с готовыми решениями:

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

Запуск другой программы через определённое время
Всем привет, незнаю где напмсать!Мне нужно что бы программа на с ++ запускала через определённое...

Запуск программ из другой программы?
Можно ли как-то написать программу, которая запускает другие программы? К примеру, у меня написан...

Win XP.Как настроить запуск программ с другой учетной записи
Полностью переустановил винд ХР с форматированием разделов. Установил драйвера и набор программ....

12
Maniac
Эксперт С++
1448 / 949 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
12.09.2014, 17:03 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <windows.h>
 
 
BOOL RunProcess(const char *lpApplicationName, DWORD dwWaitMilliseconds)
{
 
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));
 
    si.cb = sizeof(si);
 
    if ( !CreateProcessA(NULL, const_cast<LPSTR>(lpApplicationName), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
    {
        std::cout << "CreateProcess failed [" << GetLastError() << "]\n";
        return FALSE;
    }
 
 
    WaitForSingleObject(pi.hProcess, dwWaitMilliseconds);
 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    return TRUE;
}
 
int main()
{
    std::string pname = "C:\\Windows\\notepad.exe";
 
    RunProcess(pname.c_str(), INFINITE);
 
    return 0;
}
1
155 / 103 / 45
Регистрация: 30.11.2012
Сообщений: 1,136
15.09.2014, 10:03  [ТС] 3
Спасибо! Чуть подредактировал Ваш код и получилось сделать то что хотел

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <windows.h>
#include <ostream>
#include <clocale>
#include <conio.h>
#include <WinUser.h> //для определения окна
#include <ShellAPI.h> //для запуска процессов
#include <time.h>
#include <fstream>
#include <string> 
 
using namespace std;
 
BOOL RunProcess(const char *lpApplicationName, DWORD dwWaitMilliseconds)
{
 
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));
 
    si.cb = sizeof(si);
 
    if ( !CreateProcessA(NULL, const_cast<LPSTR>(lpApplicationName), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
    {
        std::cout << "CreateProcess failed [" << GetLastError() << "]\n";
        return FALSE;
    }
 
 
    WaitForSingleObject(pi.hProcess, dwWaitMilliseconds);
 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    return TRUE;
}
 
int main()
{
    //переменные
    string s1; //Переменная будет считывать строку 
 
    //чтение из файла
    ifstream in ("C:\\1.txt"); //Открываем файл для считывания информации 
    in>>s1; //считываем строку
    in.close(); // Закрываем файл
 
    std::string pname = s1;
 
    RunProcess(pname.c_str(), INFINITE);
 
    return 0;
}
Добавлено через 1 час 31 минуту
А не подскажете как реализовать чтобы он поочередно запускал программы?
Сейчас получается что он запускает 1 программу, потом ждет пока она закроется и пытается запустить 2 программу, но выдает сообщения CreateProcess failed [193]

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <windows.h>
#include <ostream>
#include <clocale>
#include <conio.h>
#include <WinUser.h> //для определения окна
#include <ShellAPI.h> //для запуска процессов
#include <time.h>
#include <fstream>
#include <string> 
 
using namespace std;
 
//объявление функций
int prog1();
int prog2();
int prog3();
 
BOOL RunProcess(const char *lpApplicationName, DWORD dwWaitMilliseconds)
{
 
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));
 
    si.cb = sizeof(si);
 
    if ( !CreateProcessA(NULL, const_cast<LPSTR>(lpApplicationName), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
    {
        std::cout << "CreateProcess failed [" << GetLastError() << "]\n";
        return FALSE;
    }
 
 
    WaitForSingleObject(pi.hProcess, dwWaitMilliseconds);
 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    return TRUE;
}
 
 
void main()
{
    setlocale(LC_CTYPE, "Russian"); //Руссификатор
 
    cout <<"Основной код программы\n";
    prog1 (); //вызов функции 1
    Sleep(2000);
    prog2 (); //вызов функции 2
    Sleep(2000);
    prog3 (); //вызов функции 3
 
    getch();
 
}
 
 
int prog1()
{
    //переменные
    string s1; //Переменная будет считывать строку 
 
    //чтение из файла
    ifstream in ("C:\\1.txt"); //Открываем файл для считывания информации 
    in>>s1; //считываем строку
    in.close(); // Закрываем файл
    
    cout <<"Запуск программы 1\n";
 
    std::string pname = s1;
 
    RunProcess(pname.c_str(), INFINITE);
 
    return 0;
}
 
int prog2()
{
    //переменные
    string s1; //Переменная будет считывать строку 
 
    //чтение из файла
    ifstream in ("C:\\2.txt"); //Открываем файл для считывания информации 
    in>>s1; //считываем строку
    in.close(); // Закрываем файл
 
    cout <<"Запуск программы 2\n";
 
    std::string pname = s1;
 
    RunProcess(pname.c_str(), INFINITE);
 
    return 0;
}
 
int prog3()
{
    //переменные
    string s1; //Переменная будет считывать строку 
 
    //чтение из файла
    ifstream in ("C:\\3.txt"); //Открываем файл для считывания информации 
    in>>s1; //считываем строку
    in.close(); // Закрываем файл
 
    cout <<"Запуск программы 3\n";
 
    std::string pname = s1;
 
    RunProcess(pname.c_str(), INFINITE);
 
    return 0;
}
0
Maniac
Эксперт С++
1448 / 949 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
15.09.2014, 10:49 4
INFINITE замени на 0 (или любое дрогое время), тогда ждать не будет.

Добавлено через 2 минуты
Цитата Сообщение от Nalik Посмотреть сообщение
пытается запустить 2 программу, но выдает сообщения CreateProcess failed [193]
ERROR_BAD_EXE_FORMAT
193 (0xC1)
%1 is not a valid Win32 application.
0
155 / 103 / 45
Регистрация: 30.11.2012
Сообщений: 1,136
15.09.2014, 12:57  [ТС] 5
Цитата Сообщение от ISergey Посмотреть сообщение
INFINITE замени на 0 (или любое дрогое время), тогда ждать не будет.
Вы меня не поняли. Я имел ввиду, что программа у меня запускает 1 программу, а 2 и 3 программу не запускает. При этом в консоли вот такие сообщения:

Запуск программ из другой программы


В файле 1.txt указан путь до программы 1, в файле 2.txt указан путь до программы 2, в файле 3.txt указан путь к программе 3. Вот)

Добавлено через 32 минуты
Частично разобрался с проблемой, точнее нашел зависимость. Если в файле 1.txt указан путь :
C:\Windows\notepad.exe, а в файле 2.txt указан путь:
D:\Программы\Uipilot\uopilot.exe и в файле 3.txt указан путь:
D:\Программы\WinRAR\WinRAR.exe

То всё работает как надо. Но если к примеру в файле 2.txt указан путь
C:\Program Files\CCleaner\CCleaner.exe
то программа 1 запустится, программа 2 не запустится и в консоле появится ошибка, программа 3 так же успешно запустится.

Получается написанная программа как-то на свое усмотрение что-то принимает, а что-то нет? Почему такое может быть?
0
Maniac
Эксперт С++
1448 / 949 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
15.09.2014, 13:05 6
Цитата Сообщение от Nalik Посмотреть сообщение
То всё работает как надо. Но если к примеру в файле 2.txt указан путь
C:\Program Files\CCleaner\CCleaner.exe
Возможно прав администратора не хватает.
0
155 / 103 / 45
Регистрация: 30.11.2012
Сообщений: 1,136
16.09.2014, 08:56  [ТС] 7
Вообще странно, запускаю из под Win XP, а там не как в 7ке, нету "Запустить от администратора"..

Добавлено через 19 часов 7 минут
Протестировал программу более детально, с правами доступа всё отлично. Все дело в том, что:
1) При чтения из файла программа не понимает путь с пробелами и всё что находится после пробела отрезает
D:\Новая папка\uopilot.exe - не принимает, считывает всё до пробела
D:\Новаяпапка\uopilot.exe - принимает полный путь.

2) Не все типы файлов открываются. Файлы имеющие расширение *exe открываются отлично, но к примеру *png, *bat и я так понимаю любые другие открываться не будут.

Не подскажете, что нужно изменить в коде, чтобы программа взаимодействовала со всеми типами файлов?
0
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
16.09.2014, 09:24 8

Не по теме:

ISergey, если я не ошибаюсь то в поздних версиях Windows ф-я CreateProcessA реализованная посредством CreateProcessW. Так какой смысл использовать ansi-версию?



Добавлено через 6 минут
Цитата Сообщение от Nalik Посмотреть сообщение
1) При чтения из файла программа не понимает путь с пробелами и всё что находится после пробела отрезает
Потому как вы передаете в ф-ю CreateProcessA имя файла как параметр командной строки. Так что либо передавайте имя файла в первом параметре либо используйте кавычки:
C++
1
CreateProcessA(NULL, "\"D:\\Новая папка\\uopilot.exe\"", ...
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 11:33 9
Цитата Сообщение от Ilot Посмотреть сообщение
C++
1
CreateProcessA(NULL, "\"D:\Новая папка\uopilot.exe\"", ...
А слэши кто будет экранировать?
1
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
16.09.2014, 11:39 10
Цитата Сообщение от Tulosba Посмотреть сообщение
А слэши кто будет экранировать?
Ну да. Copy-Paste
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
16.09.2014, 11:41 11
Вроде бы
C++
1
ShellExecute(0, NULL,"строка запуска",NULL, NULL, SW_SHOWNORMAL);
должна запускать ассоциированные файлы. Как минимум с *.html запускает браузер.
0
ISergey
16.09.2014, 12:38
  #12

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
Не по теме:
ISergey, если я не ошибаюсь то в поздних версиях Windows ф-я CreateProcessA реализованная посредством CreateProcessW. Так какой смысл использовать ansi-версию?
Лень было wchar_t писать :)

0
1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 51
06.04.2017, 17:01 13
Цитата Сообщение от Tulosba Посмотреть сообщение
CreateProcessA(NULL, ""D:\Новая папка\uopilot.exe""
C++
1
CreateProcessA(NULL, "D:\\Новая папка\\uopilot.exe"
Да, и еще. Программа может ругнуться на кириллицу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2017, 17:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

[Emu8086] Запуск из программы другой программы
Доброе утро, форумчане! Задача следующая: Есть Emu8086. Нужно написать программу, которая...

Запуск внешней программы из другой программы
День добрый! Мне нужно запустить exeшник Hello world программы при компиляции другой программы....

Запуск из программы другой программы с параметрами
Исходные данные: 1)ОС Linux ubuntu, xubuntu; 2)Есть некоторая простенькая написанная программка;...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.