Передача boost :: filesystem :: path to boost :: process :: child вызывает исключение в Windows - PullRequest
1 голос
/ 11 октября 2019

Пример кода ниже вызывает исключение в 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), все также будет преобразовано.

Но я думаю, что в обоих случаях я правильно использую дочерний процесс. Можете ли вы сказать мне, что я делаю не так?

...