Как запретить вызываемому процессу писать в унаследованное окно консоли - PullRequest
0 голосов
/ 26 апреля 2018

Я пишу программу, которая может вызывать несколько процессов и отслеживать их. Поскольку это школьный проект, мне нужно вызывать только скомпилированный код (.exe), который выполняет простые задачи (сортировка массива, сортировка списка и т. Д.). Проблема в том, что мой PARENT PROCESS имеет консольный интерфейс ascii, созданный с moveCursor(x,y), и если CHILD PROCESS имеет std::cout или printf(), он записывает данные через мой PARENT PROCESS интерфейс.

ВОПРОС: Без изменения кода CHILD PROCESSES, чтобы просто не иметь отпечатков экрана, как я могу отрицать наследование окна консоли PARENT PROCESS и заблокировать CHILD PROCESSES, чтобы создать новую консоль окно?

Я использую CreateProcess() для запуска процессов.

Я ищу решение WINDOWS .

Вот мой Process класс, который я использую для управления своими процессами.

class Process
{
    private:
        STARTUPINFO startInfo;
        PROCESS_INFORMATION processInfo;
        CHAR pathToExe[EXTENDED_MAX_PATH];
        DWORD returnedValue;
    public:

    /** I don't know how to pass a LPCSTR parameter to the constructor so i simply use
        another function to construct the class */
    /** I also don't want a global string and to simply modify it before i declare my object */
    bool Create(LPCSTR pathToFile)
    {
        ZeroMemory(&startInfo,sizeof(startInfo));
        ZeroMemory(&processInfo,sizeof(processInfo));
        ZeroMemory(&pathToExe,sizeof(pathToExe));
        ZeroMemory(&returnedValue,sizeof(returnedValue));
        strcpy(pathToExe,pathToFile);
        bool hasProcessStarted = CreateProcess(pathToFile,NULL,NULL,NULL,FALSE,0,NULL,NULL,&startInfo,&processInfo);
        return hasProcessStarted;
    }

    bool IsRunning()
    {
        if (GetExitCodeProcess(processInfo.hProcess,&processInfo.dwProcessId))
            if (processInfo.dwProcessId == STILL_ACTIVE) return true;
        return false;
    }

    /** Kind of a destructor. I just made another function because its easier to manage all the data*/
    /** Also all the Process Class Objects are dynamically allocated so i just simply delete them after Kill() returns true*/
    bool Kill(bool skipIfRunning)
    {
        if (skipIfRunning == true && IsRunning()) return false;
        if (TerminateProcess(processInfo.hProcess,0))
        {
            ZeroMemory(&startInfo,sizeof(startInfo));
            ZeroMemory(&processInfo,sizeof(processInfo));
            ZeroMemory(&pathToExe,sizeof(pathToExe));
            ZeroMemory(&returnedValue,sizeof(returnedValue));
            return true;
        }
        return false;
    }
    DWORD GetProcessReturnedValue()
    {
        return processInfo.dwProcessId;
    }

};

1 Ответ

0 голосов
/ 26 апреля 2018

Второй параметр CreateProcess - это «командная строка».

Используйте его (вместо NULL) и перенаправьте otputs на "null"

mycommandline = fullFilePath + " 1>nul 2>nul" 
CreateProcess(pathToFile, mycommandline , ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...