Въвеждане и извеждане на текст от дълго работещо конзолно приложение (C++)

Имам дълго работещо конзолно приложение, което стартира с Windows или може да се стартира от приложението, което пиша.

Имах ограничен успех при изпращането на ключове към конзолното приложение и дори не знам откъде да започна за четене на изход от него. Възможно ли е четене на изхода от конзолно приложение, което дори не е стартирано от искащото приложение?

Както и да е, два въпроса...

Как мога да емулирам ключ за "връщане"? (Ето какво трябва да изпратя конкретни ключове на приложението и приложението наистина получава ключовете, но изглежда не мога да намеря как да емулирам клавиша ENTER.

do {
    hwndCurrentWindow = FindWindowA("ConsoleWindowClass", "My Other Console App");
    if (hwndCurrentWindow == 0) {
        break;
    }

    iStringLen = GetWindowTextW (hwndCurrentWindow, wcharWindowText, 500);
    if (iStringLen == 0) {
        continue;
    }

    SetActiveWindow(hwndCurrentWindow);
    printf("Sending '?'");
    SendMessage(hwndCurrentWindow, WM_CHAR, '?', 0);
    // '?' shows up in console app
    printf("Sending 'a'");
    SendMessage(hwndCurrentWindow, WM_CHAR, 'a', 0);
    // 'a' shows up in console app.
    //printf("Sending RETURN");
    //SendMessage(hwndCurrentWindow, WM_CHAR, VK_RETURN, 0);
    // nothing happens
    break;
} while (hwndCurrentWindow);

Как мога да чета данни от конзолното приложение? (Ако другото конзолно приложение не работи непрекъснато, просто щях да запиша изхода във файл и да го прочета в... по дяволите, това все още може да работи)

Разгледах шепа опции, но много от тези, които прочетох, са за C# и за съжаление нямам лукса да сменям езиците. Има ли подобни опции за C++?

Събирайте stdout изход от конзолно приложение с C++ Това едното не работи, защото приложението не излиза. Така че просто виси и чака. Непрекъснато добавяне на повече към буфера.

Catch console input-output

Заснемане на c# изпълним изход от друга C# програма

Благодаря за всяка помощ, която можете да предоставите!


person Kyle Johnson    schedule 06.07.2013    source източник


Отговори (1)


Трябва да пренасочите входа/изхода от това приложение към вашето основно приложение. Ето статия за това: Създаване дъщерен процес с пренасочен вход и изход

person Bogolt    schedule 06.07.2013
comment
Благодаря ти! Видях и друга статия в MSDN (support.microsoft.com/kb/190351) всякакви мисли на този? - person Kyle Johnson; 06.07.2013
comment
По принцип те правят едно и също нещо. Това, което трябва да наблюдавате внимателно, е извикването на функцията CreateProcess() и параметрите, които да използвате. Ще трябва да създадете набор от канали и след това да посочите в CreateProcess(), така че те да се използват за комуникация между вашето приложение и процеса, който създавате. Сигурен съм, че можете да вземете всеки от примерите, за да получите нужните резултати. - person Bogolt; 06.07.2013
comment
Това наистина помогна! Постигнах голям успех. Използвах PID, за да затворя приложението, когато приложението ми приключи, и мога да взема изхода от конзолното приложение, но нямах късмет при изпращането на данни с командата WriteToPipe. Дори предоставянето на валиден път на файл не изпраща нищо, поставям в малка команда Sleep, за да се уверя, че работи, преди да се опита да изпрати данни, или може би не виждам данните да се изпращат, защото не се изпраща ENTER. Някакви идеи как да изпратите низ към канала g_hChildStd_IN_Wr? Или това е тръбата g_hChildStd_IN_Rd?? Това е използвано веднъж. Стена от текст. - person Kyle Johnson; 09.07.2013
comment
Не е необходимо да изпращате Enter, всичко, от което се нуждаете, е да изпратите данни към тръбата от едната страна и да ги получите от другата. Уверете се, че дъщерното приложение работи (най-добрият начин да тествате е да го накарате да работи безкрайно, винаги чакайки нещо да дойде от тръбата), има добър клиентски пример за това в връзката по-горе. И според тази връзка трябва да използвате g_hChildStd_IN_Wr, за да пишете в тръба. - person Bogolt; 10.07.2013
comment
Това си помислих, затова опитах да изпратя \r\n или негов вариант. Конзолното приложение, което се стартира, основно изхвърля някаква информация към STDOUT и след това продължава да опреснява последния ред, чакайки въвеждане от потребителя. Това блокира секцията ReadFromPipe(). Като оставим това настрана, дори изпращането на текст чрез WriteToPipe не изглежда да се справя. Много е разочароващо, но всеки ден се приближавам малко повече. - person Kyle Johnson; 10.07.2013
comment
Първо трябва да разберете коя част от вашия код не работи правилно. Може да е изпращаща или получаваща страна. За да получите това - опитайте да използвате проби на трети страни (както в връзката по-горе) с вашите компоненти, така че ще знаете коя част от кода е виновна. След това можете просто да проверите с проби, за да разберете какво точно правите погрешно. - person Bogolt; 11.07.2013
comment
Да, открих, че приложението, към което се опитвам да изпратя данни, използва ReadConsoleInput, така че трябва да използвам някаква версия на ConsoleWrite.. И точно сега се опитвам да разбера как да създам INPUT_RECORD, както ще бъде създаден от ReadConsoleInput, за да мога да го изпратя на ConsoleWrite. - person Kyle Johnson; 11.07.2013