shell_path.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Copyright (c) 2006, 2007 Julio M. Merino Vidal
  2. // Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
  3. // Copyright (c) 2009 Boris Schaeling
  4. // Copyright (c) 2010 Felipe Tanus, Boris Schaeling
  5. // Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. #ifndef BOOST_PROCESS_WINDOWS_SHELL_PATH_HPP
  10. #define BOOST_PROCESS_WINDOWS_SHELL_PATH_HPP
  11. #include <boost/process/detail/config.hpp>
  12. #include <system_error>
  13. #include <boost/filesystem/path.hpp>
  14. #include <boost/winapi/basic_types.hpp>
  15. #include <boost/winapi/get_system_directory.hpp>
  16. namespace boost { namespace process { namespace detail { namespace windows {
  17. inline boost::filesystem::path shell_path()
  18. {
  19. ::boost::winapi::WCHAR_ sysdir[260];
  20. unsigned int size = ::boost::winapi::get_system_directory(sysdir, sizeof(sysdir));
  21. if (!size)
  22. throw_last_error("GetSystemDirectory() failed");
  23. boost::filesystem::path p = sysdir;
  24. return p / "cmd.exe";
  25. }
  26. inline boost::filesystem::path shell_path(std::error_code &ec) noexcept
  27. {
  28. ::boost::winapi::WCHAR_ sysdir[260];
  29. unsigned int size = ::boost::winapi::get_system_directory(sysdir, sizeof(sysdir));
  30. boost::filesystem::path p;
  31. if (!size)
  32. ec = std::error_code(
  33. ::boost::winapi::GetLastError(),
  34. std::system_category());
  35. else
  36. {
  37. ec.clear();
  38. p = sysdir;
  39. p /= "cmd.exe";
  40. }
  41. return p;
  42. }
  43. }}}}
  44. #endif