Система () запускает окно консоли и запускает программу в этом окне консоли.
popen () запускает программу без окна консоли и перенаправляет вывод консоли в канал.
CreateProcess () просто запускает программу. Вы передаете аргумент flags, указывающий, что делать с консолями. Это также позволяет программе запускаться с различными разрешениями для родительской программы.
Если у вас нет прав на cmd.exe, то system () отключается от меню.
popen () может работать, если программе не нужно записывать в stdout или stderr, поскольку это будет потеряно.
Возможно, вам лучше написать что-то вроде этого:
bool RunProgram(const std::string &sProgram, bool bWaitForFinish)
{
#if defined(Win32)
// Launch with CreateProcess()
// wait if required
#else
// launch with fork()/exec() or even system()
// wait if required
#endif
return error_status;
}