2 * Copyright 2010 Vicente J. Botet Escriba
3 * Copyright 2014 Renato Tegon Forti, Antony Polukhin
4 * Copyright 2015 Andrey Semashev
5 * Copyright 2015 Antony Polukhin
7 * Distributed under the Boost Software License, Version 1.0.
8 * See http://www.boost.org/LICENSE_1_0.txt
11 #ifndef BOOST_WINAPI_DLL_HPP_INCLUDED_
12 #define BOOST_WINAPI_DLL_HPP_INCLUDED_
14 #include <boost/winapi/basic_types.hpp>
16 #ifdef BOOST_HAS_PRAGMA_ONCE
20 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
22 #if !defined( BOOST_USE_WINDOWS_H )
24 namespace boost { namespace winapi {
26 typedef INT_PTR_ (BOOST_WINAPI_WINAPI_CC *FARPROC_)();
27 typedef INT_PTR_ (BOOST_WINAPI_WINAPI_CC *NEARPROC_)();
28 typedef INT_PTR_ (BOOST_WINAPI_WINAPI_CC *PROC_)();
30 typedef int (BOOST_WINAPI_WINAPI_CC *FARPROC_)();
31 typedef int (BOOST_WINAPI_WINAPI_CC *NEARPROC_)();
32 typedef int (BOOST_WINAPI_WINAPI_CC *PROC_)();
34 }} // namespace boost::winapi
36 #if !defined( BOOST_NO_ANSI_APIS )
37 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
38 LoadLibraryA(boost::winapi::LPCSTR_ lpFileName);
40 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
42 boost::winapi::LPCSTR_ lpFileName,
43 boost::winapi::HANDLE_ hFile,
44 boost::winapi::DWORD_ dwFlags
47 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
48 GetModuleHandleA(boost::winapi::LPCSTR_ lpFileName);
50 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
52 boost::winapi::HMODULE_ hModule,
53 boost::winapi::LPSTR_ lpFilename,
54 boost::winapi::DWORD_ nSize
58 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
59 LoadLibraryW(boost::winapi::LPCWSTR_ lpFileName);
61 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
63 boost::winapi::LPCWSTR_ lpFileName,
64 boost::winapi::HANDLE_ hFile,
65 boost::winapi::DWORD_ dwFlags
68 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
69 GetModuleHandleW(boost::winapi::LPCWSTR_ lpFileName);
71 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
73 boost::winapi::HMODULE_ hModule,
74 boost::winapi::LPWSTR_ lpFilename,
75 boost::winapi::DWORD_ nSize
78 #if !defined( UNDER_CE )
79 BOOST_SYMBOL_IMPORT boost::winapi::FARPROC_ BOOST_WINAPI_WINAPI_CC
80 GetProcAddress(boost::winapi::HMODULE_ hModule, boost::winapi::LPCSTR_ lpProcName);
82 // On Windows CE there are two functions: GetProcAddressA (since Windows CE 3.0) and GetProcAddressW.
83 // GetProcAddress is a macro that is _always_ defined to GetProcAddressW.
84 BOOST_SYMBOL_IMPORT boost::winapi::FARPROC_ BOOST_WINAPI_WINAPI_CC
85 GetProcAddressA(boost::winapi::HMODULE_ hModule, boost::winapi::LPCSTR_ lpProcName);
86 BOOST_SYMBOL_IMPORT boost::winapi::FARPROC_ BOOST_WINAPI_WINAPI_CC
87 GetProcAddressW(boost::winapi::HMODULE_ hModule, boost::winapi::LPCWSTR_ lpProcName);
90 struct _MEMORY_BASIC_INFORMATION;
92 #if !defined( BOOST_WINAPI_IS_MINGW )
93 BOOST_SYMBOL_IMPORT boost::winapi::SIZE_T_ BOOST_WINAPI_WINAPI_CC
95 boost::winapi::LPCVOID_ lpAddress,
96 ::_MEMORY_BASIC_INFORMATION* lpBuffer,
97 boost::winapi::SIZE_T_ dwLength
99 #else // !defined( BOOST_WINAPI_IS_MINGW )
100 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
102 boost::winapi::LPCVOID_ lpAddress,
103 ::_MEMORY_BASIC_INFORMATION* lpBuffer,
104 boost::winapi::DWORD_ dwLength
106 #endif // !defined( BOOST_WINAPI_IS_MINGW )
108 #endif // #if !defined( BOOST_USE_WINDOWS_H )
113 typedef struct BOOST_MAY_ALIAS MEMORY_BASIC_INFORMATION_ {
115 PVOID_ AllocationBase;
116 DWORD_ AllocationProtect;
121 } *PMEMORY_BASIC_INFORMATION_;
123 #if defined( BOOST_USE_WINDOWS_H )
124 typedef ::FARPROC FARPROC_;
125 typedef ::NEARPROC NEARPROC_;
126 typedef ::PROC PROC_;
128 BOOST_CONSTEXPR_OR_CONST DWORD_ DONT_RESOLVE_DLL_REFERENCES_ = DONT_RESOLVE_DLL_REFERENCES;
129 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_ = LOAD_WITH_ALTERED_SEARCH_PATH;
130 #else // defined( BOOST_USE_WINDOWS_H )
131 BOOST_CONSTEXPR_OR_CONST DWORD_ DONT_RESOLVE_DLL_REFERENCES_ = 0x00000001;
132 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_ = 0x00000008;
133 #endif // defined( BOOST_USE_WINDOWS_H )
135 // This one is not defined by MinGW
136 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_IGNORE_CODE_AUTHZ_LEVEL_ = 0x00000010;
138 #if !defined( BOOST_NO_ANSI_APIS )
139 using ::LoadLibraryA;
140 using ::LoadLibraryExA;
141 using ::GetModuleHandleA;
142 using ::GetModuleFileNameA;
143 #endif // !defined( BOOST_NO_ANSI_APIS )
144 using ::LoadLibraryW;
145 using ::LoadLibraryExW;
146 using ::GetModuleHandleW;
147 using ::GetModuleFileNameW;
149 #if !defined( UNDER_CE )
150 // For backward compatibility, don't use directly. Use get_proc_address instead.
151 using ::GetProcAddress;
153 using ::GetProcAddressA;
154 using ::GetProcAddressW;
157 BOOST_FORCEINLINE FARPROC_ get_proc_address(HMODULE_ hModule, LPCSTR_ lpProcName)
159 #if !defined( UNDER_CE )
160 return ::GetProcAddress(hModule, lpProcName);
162 return ::GetProcAddressA(hModule, lpProcName);
166 BOOST_FORCEINLINE SIZE_T_ VirtualQuery(LPCVOID_ lpAddress, MEMORY_BASIC_INFORMATION_* lpBuffer, SIZE_T_ dwLength)
168 return ::VirtualQuery(lpAddress, reinterpret_cast< ::_MEMORY_BASIC_INFORMATION* >(lpBuffer), dwLength);
171 #if !defined( BOOST_NO_ANSI_APIS )
172 BOOST_FORCEINLINE HMODULE_ load_library(LPCSTR_ lpFileName)
174 return ::LoadLibraryA(lpFileName);
177 BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
179 return ::LoadLibraryExA(lpFileName, hFile, dwFlags);
182 BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCSTR_ lpFileName)
184 return ::GetModuleHandleA(lpFileName);
187 BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPSTR_ lpFilename, DWORD_ nSize)
189 return ::GetModuleFileNameA(hModule, lpFilename, nSize);
191 #endif // #if !defined( BOOST_NO_ANSI_APIS )
193 BOOST_FORCEINLINE HMODULE_ load_library(LPCWSTR_ lpFileName)
195 return ::LoadLibraryW(lpFileName);
198 BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCWSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
200 return ::LoadLibraryExW(lpFileName, hFile, dwFlags);
203 BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCWSTR_ lpFileName)
205 return ::GetModuleHandleW(lpFileName);
208 BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPWSTR_ lpFilename, DWORD_ nSize)
210 return ::GetModuleFileNameW(hModule, lpFilename, nSize);
213 } // namespace winapi
216 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
219 // FreeLibrary is in a different partition set (slightly)
222 #if BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
224 #if !defined(BOOST_USE_WINDOWS_H)
226 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
227 FreeLibrary(boost::winapi::HMODULE_ hModule);
237 #endif // BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
238 #endif // BOOST_WINAPI_DLL_HPP_INCLUDED_