LINUX.ORG.RU
Ответ на: комментарий от DELIRIUM

system()

Это действительно подходит. Но почему-то не работает если имя программы содержит скобки (по крайней мере в винде). Это не большая проблема, но почему так?

user08
() автор топика
Ответ на: комментарий от user08

Попробуй как-то так (это из виндового продакшена):

int shell_exec_and_wait(const std::string& cmd) {
#ifdef STATICLIB_WINDOWS
    std::string quoted = "\"" + cmd + "\"";
    std::wstring ws = widen(quoted);
    return _wsystem(ws.c_str());
#else
    return std::system(cmd.c_str());
#endif // STATICLIB_WINDOWS
}

widen где-то в boost.nowide подсмотрен был, он utf8 в utf16 переводит средствами виндовса.

anonymous
()
Ответ на: комментарий от slackwarrior

Мсье знает толк.

:))) Ну это ваще не проблема. Я то могу и в ProgramName_Debug переименовать. Просто интересна причина.

user08
() автор топика
Ответ на: комментарий от user08

Просто интересна причина.

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

KennyMinigun ★★★★★
()
Ответ на: комментарий от user08

Экранируй.

Либо каждый спецсимвол отдельно:

ProgramName(Debug).exe -> ProgramName\(Debug\).exe

но множество этих символов и способ экранирования системо-зависимы (в венде, скажем, «\» это нормальный символ и используется в путях, как там экранировать я не помню, возможно через «^»)

Либо бери каждый аргумент в двойные кавычки

ProgramName(Debug).exe > "ProgramName(Debug).exe"
но тут нужно учесть что в аргументе также могут быть двойные кавычки и их, опять таки, нужно экранировать.

На самом деле хотя бы из-за этого system - говно, и лучше написать под #ifdef для windows - CreateProcess или как там его, для всего остального - fork+exec.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.