Пример кода ниже вызывает исключение в Windows:
#include <boost/filesystem.hpp>
#include <boost/process.hpp>
using namespace boost::filesystem;
using namespace boost::process;
int main()
{
child child(exe = search_path("app", { current_path() / "app_dir" }),
args = { "--help" });
child.wait();
return 0;
}
Но это не так:
#include <boost/filesystem.hpp>
#include <boost/process.hpp>
using namespace boost::filesystem;
using namespace boost::process;
int main()
{
child child(search_path("app", { current_path() / "app_dir" }).string(),
"--help");
child.wait();
return 0;
}
Это сообщение об исключении:
boost codecvt to wchar_t: error
Я нашел некоторую информацию о codecvt в документации Boost:
Поскольку windows не использует UTF-8, иногда неизбежно использовать версию WinApi wchar_t. Чтобы обеспечить согласованность этой библиотеки, она также поддерживает wchar_t в posix.
Поскольку api posix чисто char, каждый тип на основе wchar_t будет преобразован в char.
С другой стороны, Windows более избирательна;по умолчанию используется char, но если для любого параметра требуется wchar_t, все будет преобразовано в wchar_t. Это также включает в себя boost :: filesystem :: path. Кроме того, если система не предоставляет char api (как в случае с Windows CE), все также будет преобразовано.
Но я думаю, что в обоих случаях я правильно использую дочерний процесс. Можете ли вы сказать мне, что я делаю не так?