1 /*=========================================================================
2  *
3  *  Copyright Insight Software Consortium
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *         http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkDynamicLoader_h
19 #define itkDynamicLoader_h
20 
21 #include "itkObject.h"
22 #include "itkObjectFactory.h"
23 #include "itksys/DynamicLoader.hxx"
24 
25 namespace itk
26 {
27 /** \class DynamicLoader
28  * \brief Portable loading of dynamic libraries or dll's.
29  *
30  * DynamicLoader provides a portable interface to loading dynamic
31  * libraries or dll's into a process.
32  *
33  * \ingroup OSSystemObjects
34  * \ingroup ITKCommon
35  */
36 
37 //BTX
38 using LibHandle = itksys::DynamicLoader::LibraryHandle;
39 // Cannot use this as this is a void (*)() but ITK old API used to be void*
40 using SymbolPointer = itksys::DynamicLoader::SymbolPointer;
41 //ETX
42 
43 class ITKCommon_EXPORT DynamicLoader:public Object
44 {
45 public:
46   ITK_DISALLOW_COPY_AND_ASSIGN(DynamicLoader);
47 
48   /** Standard class type aliases. */
49   using Self = DynamicLoader;
50   using Superclass = Object;
51   using Pointer = SmartPointer< Self >;
52   using ConstPointer = SmartPointer< const Self >;
53 
54   /** Method for creation through the object factory. */
55   itkNewMacro(Self);
56 
57   /** Run-time type information (and related methods). */
58   itkTypeMacro(DynamicLoader, Object);
59 
60   /** Load a dynamic library into the current process.
61    * The returned LibHandle can be used to access the symbols in the
62    * library. */
63   static LibHandle OpenLibrary(const char *);
64 
65   /** Attempt to detach a dynamic library from the
66    * process.  A value of true is returned if it is successful. */
67   static int CloseLibrary(LibHandle);
68 
69   /** Find the address of the symbol in the given library. */
70   static void *GetSymbolAddress(LibHandle, const char *);
71 
72   /** Return the library prefix for the given architecture */
73   static const char * LibPrefix();
74 
75   /** Return the library extension for the given architecture. */
76   static const char * LibExtension();
77 
78   /** Return the last error produced from a calls made on this class. */
79   static const char * LastError();
80 
81 protected:
82   DynamicLoader();
83   ~DynamicLoader() override;
84 };
85 } // end namespace itk
86 
87 #endif
88