diff -Naur a/boost/program_options/environment_iterator.hpp b/boost/program_options/environment_iterator.hpp --- a/boost/program_options/environment_iterator.hpp 2004-05-14 15:40:30.000000000 +0200 +++ b/boost/program_options/environment_iterator.hpp 2014-01-17 17:33:52.710115300 +0100 @@ -12,6 +12,16 @@ #include #include +#if defined(_WIN32) +#include +#endif + +#if defined(_WIN32) && defined(__MINGW32__) +#define ENVIRON_IT_TYPE LPTCH +#else +#define ENVIRON_IT_TYPE char** +#endif + namespace boost { class environment_iterator @@ -19,7 +29,7 @@ std::pair > { public: - environment_iterator(char** environment) + environment_iterator(ENVIRON_IT_TYPE environment) : m_environment(environment) { get(); @@ -35,17 +45,28 @@ if (*m_environment == 0) found_eof(); else { +#if defined(_WIN32) && defined(__MINGW32__) + std::string s(m_environment); +#else std::string s(*m_environment); +#endif std::string::size_type n = s.find('='); assert(n != s.npos); value().first = s.substr(0, n); value().second = s.substr(n+1); - } - ++m_environment; +#if defined(_WIN32) && defined(__MINGW32__) + m_environment += s.length() + 1; +#else + ++m_environment; +#endif + } } private: - char** m_environment; + ENVIRON_IT_TYPE m_environment; }; } + +#undef ENVIRON_IT_TYPE + #endif diff -Naur a/libs/program_options/src/parsers.cpp b/libs/program_options/src/parsers.cpp --- a/libs/program_options/src/parsers.cpp 2012-04-08 12:02:26.000000000 +0200 +++ b/libs/program_options/src/parsers.cpp 2014-01-17 17:34:03.994197200 +0100 @@ -30,6 +30,7 @@ #ifdef _WIN32 #include +#include #else #include #endif @@ -190,6 +191,10 @@ const function1& name_mapper) { parsed_options result(&desc); + +#if defined(_WIN32) && defined(__MINGW32__) + LPTCH environ = GetEnvironmentStrings(); +#endif for(environment_iterator i(environ), e; i != e; ++i) { string option_name = name_mapper(i->first); @@ -201,6 +206,10 @@ result.options.push_back(n); } } + +#if defined(_WIN32) && defined(__MINGW32__) + FreeEnvironmentStrings(environ); +#endif return result; }