Mercurial > code
annotate C++/DynLib.h @ 197:0b029b53ff55
DynLib: Add EXPORT because it's needed on Windows C linkage
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 28 Nov 2013 21:06:37 +0100 |
parents | 274b4f216e65 |
children | d157f4747676 |
rev | line source |
---|---|
195
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * DynLib.h -- portable shared library loader |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013 David Demelier <markand@malikania.fr> |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #ifndef _DYN_LIB_H_ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #define _DYN_LIB_H_ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <string> |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
196
274b4f216e65
DynLib: Windows support complete
David Demelier <markand@malikania.fr>
parents:
195
diff
changeset
|
24 #if defined(_MSC_VER) |
274b4f216e65
DynLib: Windows support complete
David Demelier <markand@malikania.fr>
parents:
195
diff
changeset
|
25 # include <Windows.h> |
197
0b029b53ff55
DynLib: Add EXPORT because it's needed on Windows C linkage
David Demelier <markand@malikania.fr>
parents:
196
diff
changeset
|
26 # define EXPORT __declspec(dllexport) |
0b029b53ff55
DynLib: Add EXPORT because it's needed on Windows C linkage
David Demelier <markand@malikania.fr>
parents:
196
diff
changeset
|
27 #else |
0b029b53ff55
DynLib: Add EXPORT because it's needed on Windows C linkage
David Demelier <markand@malikania.fr>
parents:
196
diff
changeset
|
28 # define EXPORT |
196
274b4f216e65
DynLib: Windows support complete
David Demelier <markand@malikania.fr>
parents:
195
diff
changeset
|
29 #endif |
274b4f216e65
DynLib: Windows support complete
David Demelier <markand@malikania.fr>
parents:
195
diff
changeset
|
30 |
195
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 /** |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 * @class DynLib |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 * @brief Load a dynamic module |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 * |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 * This class is a portable wrapper to load shared libraries on |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 * supported systems. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 class DynLib { |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 public: |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 #if defined(_MSC_VER) |
196
274b4f216e65
DynLib: Windows support complete
David Demelier <markand@malikania.fr>
parents:
195
diff
changeset
|
41 using Handle = HMODULE; |
274b4f216e65
DynLib: Windows support complete
David Demelier <markand@malikania.fr>
parents:
195
diff
changeset
|
42 using Sym = FARPROC; |
195
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 #else |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 using Handle = void *; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 using Sym = void *; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 #endif |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 enum Policy { |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 Immediately, //! load symbols immediately |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 Lazy //! load symbols when needed |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 }; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 private: |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 Handle m_handle; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 void systemInit(); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 Handle systemLoad(const std::string &path, Policy policy) const; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 Sym systemSym(const std::string &name); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 void systemClose(); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 public: |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 /** |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 * Copy is forbidden. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 DynLib(const DynLib &) = delete; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 DynLib &operator=(const DynLib &) = delete; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 /** |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 * Default constructor. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 DynLib(); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 /** |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 * Constructor to load a shared module. The path must |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 * be absolute. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 * |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 * @param path the absolute path |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 * @param policy the policy to load |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 * @throw std::runtime_error on error |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 DynLib(const std::string &path, |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 Policy policy = Immediately); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 /** |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 * Close the library automatically. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 ~DynLib(); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 /** |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 * Get a symbol from the library. |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 * |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 * @param name the symbol |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 * @return the symbol |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 * @throw std::runtime_error on error |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 * @throw std::out_of_range if not found |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 */ |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 template <typename T> |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 T sym(const std::string &name) |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 { |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 return reinterpret_cast<T>(systemSym(name)); |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 } |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 }; |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 |
42b77e0161d0
Add a dynamic library loader
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 #endif // !_DYN_LIB_H_ |