Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

Как запустить внешнее консольное приложение и получить то, что будет выведено на экран?

26.08.2015, 13:35. Показов 1626. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть программка которая распознает капчу, когда я ее запускаю из командной строки выводится значение капчи на экран
Как запустить внешнее консольное приложение и получить то, что будет выведено на экран?

от так вызываю да вызывается, но как получить данные с экрана кто знает, можно ли как то их получить?
C++
1
system("recognition.exe img.png");
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2015, 13:35
Ответы с готовыми решениями:

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

Что будет выведено на экран? Обьясните как распределяется память
.Что будет выведено на экран в результате работы програм-мы? Какие задачи решает процедура?...

Запустить внешнее приложение, передать ему параметры и получить результат
Здравствуйте. Проблема такая: RunCommand(exe_name,,output); Думаю, что такое exe_name и...

Что будет выведено на экран?
Дана программа на Паскале. Первая строка программы отключает проверку выхода за границы разрядной...

11
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
26.08.2015, 14:06  [ТС] 2
есть программа на CLI написана и из нее вызывается программа recognition.exe и из нее берутся данные, как такое можно сделать из С++ программы MFC???
0
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
26.08.2015, 19:01 3
Лучший ответ Сообщение было отмечено ninja2 как решение

Решение

Цитата Сообщение от ninja2 Посмотреть сообщение
от так вызываю да вызывается, но как получить данные с экрана кто знает, можно ли как то их получить?
Попробуйте перенаправить выход в файл:
>recognition.exe img.png > result.txt
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
26.08.2015, 21:02  [ТС] 4
SerVal, ну да, можно еще как то процесс создать хз. как, лучше перенаправить и другую функцию использовать Win какую то там чтобы окошко скрыть.
0
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
26.08.2015, 22:23 5
Цитата Сообщение от ninja2 Посмотреть сообщение
можно еще как то процесс создать хз
Какие проблемы? Туточки всё на русском и примерчик(main) с запуском notepad.exe
Развлекайтесь.

http://www.firststeps.ru/mfc/winapi/r.php?131
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
30.08.2015, 22:39  [ТС] 6
Цитата Сообщение от SerVal Посмотреть сообщение
Какие проблемы? Туточки всё на русском и примерчик(main) с запуском notepad.exe
Развлекайтесь.
Не получается передать параметр в консоль, делаю так
C++
1
2
if (!CreateProcess(L"recognition.exe",L"img.png",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,
                     NULL,NULL,&si,&pi))
img.png не попадает в приложение. recognition.exe запускается без параметра. Как сделать чтобы оно с параметром запустилось?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
30.08.2015, 22:56 7
Цитата Сообщение от ninja2 Посмотреть сообщение
recognition.exe запускается без параметра.
как вы это определили?
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.08.2015, 23:15 8
Цитата Сообщение от ninja2 Посмотреть сообщение
от так вызываю да вызывается, но как получить данные с экрана кто знает, можно ли как то их получить?
перенаправление потоков ввода-вывода.

1.
родительский процесс создает каналы передачи данных.

2.
затем создает дочерний процесс.
указав в настройках, что выхлоп дочернего процесса нужно направить в каналы

3.
ожидает завершения дочернего процесса.

4.
родительский процесс вычитывает всю информацию из каналов.
и таким образом заполучает к себе весь его выхлоп.

5.
профит!

Как сплести набор взаимосвязанных утилит ?
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.08.2015, 08:33  [ТС] 9
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
как вы это определили?
По тому что вывод получается такой когда просто вызывается без параметра recogintion.exe, если бы img.png передалось был бы другой вывод.
0
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
31.08.2015, 09:09 10
Для просмотра переданых параметров создайте пустой проект "myRecognition".
Добавьте в него:

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
void save_parameters(std::string str_parameters, std::string output_file_name)
{
    std::ofstream ofile(output_file_name);
 
    for (long long i = 0; i < str_parameters.size(); i++)
        ofile << str_parameters[i];
 
    ofile.close();
}
 
int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "russian");
    
    string str_parameters = "Число аргументов: " + to_string(argc) + "\r\n";
 
    for (int i = 0; i < argc; i++)
    {
        str_parameters += "Аргумент " + to_string(i) + ": " + argv[i] + "\r\n";
    }
 
    std::string output_file_name = "parameters.txt";
    save_parameters(str_parameters, output_file_name);
    std::cout << "Параметры сохранены в файле " << output_file_name << std::endl;
}
Результат:
C++
1
2
>myRecognition.exe -generate "4^5-6"
Параметры сохранены в файле parameters.txt
Содержимое файла parameters.txt

C++
1
2
3
4
Число аргументов: 3
Аргумент 0: myRecognition.exe
Аргумент 1: -generate
Аргумент 2: 4^5-6
Из своей программы вызовите myRecognition.exe и посмотрите, что Ваша программа передаёт ей в качестве параметров.
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.08.2015, 21:04  [ТС] 11
Цитата Сообщение от SerVal Посмотреть сообщение
Из своей программы вызовите myRecognition.exe и посмотрите, что Ваша программа передаёт ей в качестве параметров.
Да ниче она не передает, если что то бы передавала, recognition.exe возвращала бы что то, а так она возвращает то что возвращается когда она вызывается без параметров. В командной строке лучше вызвать ее с параметрами и без и посмотреть что она будет возвращать.
0
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
01.09.2015, 00:42 12
Охохо.. Вот программулина, которая запускает процесс и передаёт ему параметр.
Замените в ней notepad.exe и c:\\test.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
45
46
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <wchar.h>
 
#include <string>
#include <iostream>
#include <sstream> 
#include <fstream>
 
int main(int argc, char* argv[])
{
    PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter
    STARTUPINFO StartupInfo;         //This is an [in] parameter
 
    wchar_t path_to_exe[] = L"c:\\windows\\notepad.exe";
    wchar_t cmdArgs[] = L"notepad.exe c:\\test.txt"; // argv[]
 
    ZeroMemory(&StartupInfo, sizeof(StartupInfo));
    StartupInfo.cb = sizeof StartupInfo; //Only compulsory field
 
    if (CreateProcess(
        path_to_exe,
        cmdArgs,
        NULL, 
        NULL,
        FALSE, 
        0, 
        NULL,
        NULL,
        &StartupInfo, 
        &ProcessInfo))
    {
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);
 
        printf("Процесс создан.");
    }
    else
    {
        printf("Процесс НЕ создан.");
    }
    return 0;
}


Добавлено через 3 часа 3 минуты
Как получить данные из окна консоли:
main:
Кликните здесь для просмотра всего текста

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
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <wchar.h>
 
#include <string>
#include <iostream>
#include <sstream> 
#include <fstream>
 
int main(int argc, char* argv[])
{
    setlocale(LC_CTYPE, "russian");
 
    // создаём файлец для результата
    FILE* lLogFile = freopen("result.txt", "w", stdout);
    
    // создаём командную стороку 
    // если файлы не в одной директории, пути должны быть полными.
               wchar_t cmdArgs[] = L"recognition.exe img.png"; 
 
    // создаём процесс
    PROCESS_INFORMATION pInfo;
    STARTUPINFO sInfo;
    ZeroMemory(&sInfo, sizeof(sInfo));
    sInfo.cb = sizeof(sInfo);
    sInfo.dwFlags = STARTF_USESHOWWINDOW;
    sInfo.wShowWindow = SW_HIDE;
 
    if (CreateProcess(NULL, 
        cmdArgs,
        NULL,
        NULL,
        TRUE,
        0,
        NULL, NULL,
        &sInfo, &pInfo) == 0)
    {
        printf("Ошибка при создании процесса.");
        return -1;
    }
 
    // ждём завершения процесса
    HANDLE aHandles = pInfo.hProcess;
    WaitForMultipleObjects(1, &aHandles, FALSE, INFINITE); // бесконечно.
    /*
    if (WaitForMultipleObjects(1, &aHandles, FALSE, 120000) == WAIT_TIMEOUT) // 120 секунд
    {
        printf("TIMEOUT");
    }
    */
 
    CloseHandle(pInfo.hProcess);
    CloseHandle(pInfo.hThread);
    fclose(lLogFile);
    fclose(stdout);
 
    // освобождаем stdout
    freopen("CON", "w", stdout);
    return 0;
}


Результат в файле result.txt
*на freopen компилятор обычно ругается, поэтому в Preprocessor Definition надо добавить _CRT_SECURE_NO_WARNINGS
0
01.09.2015, 00:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2015, 00:42
Помогаю со студенческими работами здесь

Что будет выведено на экран
var i:integer; begin i:=0; if i&lt;0 then i:=1 else if i&lt;0 then i:=2 else if i&lt;=then 1:=3; ...

Что будет выведено на экран?
Увидел только что такую вот интересную задачку на одном форуме #include &lt;iostream&gt; struct aaa...

Что будет выведено на экран
Программа следующая - Program P1; Var c,d: integer; Procedure Q (Var x:integer; y:integer);...

Что будет выведено на экран?
var i:integer; begin i:=0; if ((i&lt;0) OR (i=2)) AND (&lt;&gt;1)then i:=3 else i:=4; writeln(i)...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru