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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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_