Я пишу программу, которая может вызывать несколько процессов и отслеживать их. Поскольку это школьный проект, мне нужно вызывать только скомпилированный код (.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;
}
};