2 * Copyright 2016 Klemens D. Morgenstern
4 * Distributed under the Boost Software License, Version 1.0.
5 * See http://www.boost.org/LICENSE_1_0.txt
8 #ifndef BOOST_WINAPI_ENVIRONMENT_HPP_INCLUDED_
9 #define BOOST_WINAPI_ENVIRONMENT_HPP_INCLUDED_
11 #include <boost/winapi/basic_types.hpp>
13 #ifdef BOOST_HAS_PRAGMA_ONCE
17 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
19 #include <boost/winapi/detail/header.hpp>
21 #if defined(GetEnvironmentStrings)
22 // Unlike most of the WinAPI, GetEnvironmentStrings is a real function and GetEnvironmentStringsA is a macro.
23 // In UNICODE builds, GetEnvironmentStrings is also defined as a macro that redirects to GetEnvironmentStringsW,
24 // and the narrow character version become inaccessible. Facepalm.
25 #if defined(_MSC_VER) || defined(__GNUC__)
26 #pragma push_macro("GetEnvironmentStrings")
28 #undef GetEnvironmentStrings
29 #define BOOST_WINAPI_DETAIL_GET_ENVIRONMENT_STRINGS_UNDEFINED
30 #endif // defined(GetEnvironmentStrings)
32 #if !defined( BOOST_USE_WINDOWS_H )
34 #if !defined( BOOST_NO_ANSI_APIS )
35 BOOST_WINAPI_IMPORT boost::winapi::LPSTR_ BOOST_WINAPI_WINAPI_CC GetEnvironmentStrings();
36 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC FreeEnvironmentStringsA(boost::winapi::LPSTR_);
38 BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC GetEnvironmentVariableA(
39 boost::winapi::LPCSTR_ lpName,
40 boost::winapi::LPSTR_ lpBuffer,
41 boost::winapi::DWORD_ nSize
44 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC SetEnvironmentVariableA(
45 boost::winapi::LPCSTR_ lpName,
46 boost::winapi::LPCSTR_ lpValue
48 #endif // !defined( BOOST_NO_ANSI_APIS )
50 BOOST_WINAPI_IMPORT boost::winapi::LPWSTR_ BOOST_WINAPI_WINAPI_CC GetEnvironmentStringsW();
51 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC FreeEnvironmentStringsW(boost::winapi::LPWSTR_);
53 BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC GetEnvironmentVariableW(
54 boost::winapi::LPCWSTR_ lpName,
55 boost::winapi::LPWSTR_ lpBuffer,
56 boost::winapi::DWORD_ nSize
59 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC SetEnvironmentVariableW(
60 boost::winapi::LPCWSTR_ lpName,
61 boost::winapi::LPCWSTR_ lpValue
64 #endif // !defined( BOOST_USE_WINDOWS_H )
69 #if !defined( BOOST_NO_ANSI_APIS )
70 using ::GetEnvironmentStrings;
71 using ::FreeEnvironmentStringsA;
72 using ::GetEnvironmentVariableA;
73 using ::SetEnvironmentVariableA;
74 #endif // !defined( BOOST_NO_ANSI_APIS )
76 using ::GetEnvironmentStringsW;
77 using ::FreeEnvironmentStringsW;
78 using ::GetEnvironmentVariableW;
79 using ::SetEnvironmentVariableW;
81 template< typename Char >
82 Char* get_environment_strings();
84 #if !defined( BOOST_NO_ANSI_APIS )
87 BOOST_FORCEINLINE char* get_environment_strings< char >()
89 return GetEnvironmentStrings();
92 BOOST_FORCEINLINE BOOL_ free_environment_strings(LPSTR_ p)
94 return FreeEnvironmentStringsA(p);
97 BOOST_FORCEINLINE DWORD_ get_environment_variable(LPCSTR_ name, LPSTR_ buffer, DWORD_ size)
99 return GetEnvironmentVariableA(name, buffer, size);
102 BOOST_FORCEINLINE BOOL_ set_environment_variable(LPCSTR_ name, LPCSTR_ value)
104 return SetEnvironmentVariableA(name, value);
107 #endif // !defined( BOOST_NO_ANSI_APIS )
110 BOOST_FORCEINLINE wchar_t* get_environment_strings< wchar_t >()
112 return GetEnvironmentStringsW();
115 BOOST_FORCEINLINE BOOL_ free_environment_strings(LPWSTR_ p)
117 return FreeEnvironmentStringsW(p);
120 BOOST_FORCEINLINE DWORD_ get_environment_variable(LPCWSTR_ name, LPWSTR_ buffer, DWORD_ size)
122 return GetEnvironmentVariableW(name, buffer, size);
125 BOOST_FORCEINLINE BOOL_ set_environment_variable(LPCWSTR_ name, LPCWSTR_ value)
127 return SetEnvironmentVariableW(name, value);
130 } // namespace winapi
133 #if defined(BOOST_WINAPI_DETAIL_GET_ENVIRONMENT_STRINGS_UNDEFINED)
134 #if defined(_MSC_VER) || defined(__GNUC__)
135 #pragma pop_macro("GetEnvironmentStrings")
136 #elif defined(UNICODE)
137 #define GetEnvironmentStrings GetEnvironmentStringsW
139 #undef BOOST_WINAPI_DETAIL_GET_ENVIRONMENT_STRINGS_UNDEFINED
140 #endif // defined(BOOST_WINAPI_DETAIL_GET_ENVIRONMENT_STRINGS_UNDEFINED)
142 #include <boost/winapi/detail/footer.hpp>
144 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
146 #endif // BOOST_WINAPI_ENVIRONMENT_HPP_INCLUDED_