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