diff options
-rw-r--r-- | Source/cmDynamicLoader.cxx | 234 | ||||
-rw-r--r-- | Source/cmDynamicLoader.h | 80 |
2 files changed, 314 insertions, 0 deletions
diff --git a/Source/cmDynamicLoader.cxx b/Source/cmDynamicLoader.cxx new file mode 100644 index 0000000000..321faf016e --- /dev/null +++ b/Source/cmDynamicLoader.cxx @@ -0,0 +1,234 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Insight Consortium. All rights reserved. + See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmDynamicLoader.h" + +// This file is actually 3 different implementations. +// 1. HP machines which uses shl_load +// 2. Apple OSX which uses NSLinkModule +// 3. Windows which uses LoadLibrary +// 4. Most unix systems which use dlopen (default ) +// Each part of the ifdef contains a complete implementation for +// the static methods of cmDynamicLoader. + +// --------------------------------------------------------------- +// 1. Implementation for HPUX machines +#ifdef __hpux +#define CMDYNAMICLOADER_DEFINED 1 +#include <dl.h> + +cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) +{ + return shl_load(libname, BIND_DEFERRED | DYNAMIC_PATH, 0L); +} + +int cmDynamicLoader::CloseLibrary(cmLibHandle lib) +{ + return 0; +} + +void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + void* addr; + int status; + + status = shl_findsym (&lib, sym, TYPE_PROCEDURE, &addr); + return (status < 0) ? (void*)0 : addr; +} + +const char* cmDynamicLoader::LibPrefix() +{ + return "lib"; +} + +const char* cmDynamicLoader::LibExtension() +{ + return ".sl"; +} + +const char* cmDynamicLoader::LastError() +{ + return 0; +} +#endif + + + +// --------------------------------------------------------------- +// 2. Implementation for Darwin (including OSX) Machines + +#ifdef __APPLE__ +#define CMDYNAMICLOADER_DEFINED +#include <mach-o/dyld.h> + +cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) +{ + NSObjectFileImageReturnCode rc; + NSObjectFileImage image; + + rc = NSCreateObjectFileImageFromFile(libname, &image); + return NSLinkModule(image, libname, TRUE); +} + +int cmDynamicLoader::CloseLibrary(cmLibHandle lib) +{ + return 0; +} + +void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + void *result=0; + if(NSIsSymbolNameDefined(sym)){ + cout << sym << " is defined!" << endl; + NSSymbol symbol= NSLookupAndBindSymbol(sym); + if(symbol){ + result = NSAddressOfSymbol(symbol); + } + }else{ + cout << sym << " is not defined!" << endl; + } + return result; +} + +const char* cmDynamicLoader::LibPrefix() +{ + return ""; +} + +const char* cmDynamicLoader::LibExtension() +{ + return ".dylib"; +} + +const char* cmDynamicLoader::LastError() +{ + return 0; +} + +#endif + + + + +// --------------------------------------------------------------- +// 3. Implementation for Windows win32 code +#ifdef _WIN32 +#include <windows.h> +#define CMDYNAMICLOADER_DEFINED 1 + +cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) +{ +#ifdef UNICODE + wchar_t *libn = new wchar_t [mbstowcs(NULL, libname, 32000)]; + mbstowcs(libn, libname, 32000); + cmLibHandle ret = LoadLibrary(libn); + delete [] libn; + return ret; +#else + return LoadLibrary(libname); +#endif +} + +int cmDynamicLoader::CloseLibrary(cmLibHandle lib) +{ + return (int)FreeLibrary(lib); +} + +void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ +#ifdef UNICODE + wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)]; + mbstowcs(wsym, sym, 32000); + void *ret = GetProcAddress(lib, wsym); + delete [] wsym; + return ret; +#else + return GetProcAddress(lib, sym); +#endif +} + +const char* cmDynamicLoader::LibPrefix() +{ + return ""; +} + +const char* cmDynamicLoader::LibExtension() +{ + return ".dll"; +} + +const char* cmDynamicLoader::LastError() +{ + LPVOID lpMsgBuf; + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + + // Free the buffer. + LocalFree( lpMsgBuf ); + static char* str = 0; + delete [] str; + str = strcpy(new char[strlen((char*)lpMsgBuf)+1], (char*)lpMsgBuf); + return str; +} + +#endif + +// --------------------------------------------------------------- +// 4. Implementation for default UNIX machines. +// if nothing has been defined then use this +#ifndef CMDYNAMICLOADER_DEFINED +#define CMDYNAMICLOADER_DEFINED +// Setup for most unix machines +#include <dlfcn.h> + +cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) +{ + return dlopen(libname, RTLD_LAZY); +} + +int cmDynamicLoader::CloseLibrary(cmLibHandle lib) +{ + return (int)dlclose(lib); +} + +void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + return dlsym(lib, sym); +} + +const char* cmDynamicLoader::LibPrefix() +{ + return "lib"; +} + +const char* cmDynamicLoader::LibExtension() +{ + return ".so"; +} + +const char* cmDynamicLoader::LastError() +{ + return dlerror(); +} +#endif diff --git a/Source/cmDynamicLoader.h b/Source/cmDynamicLoader.h new file mode 100644 index 0000000000..d5cc61246c --- /dev/null +++ b/Source/cmDynamicLoader.h @@ -0,0 +1,80 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Insight Consortium. All rights reserved. + See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +// .NAME cmDynamicLoader - class interface to system dynamic libraries +// .SECTION Description +// cmDynamicLoader provides a portable interface to loading dynamic +// libraries into a process. + + +#ifndef __cmDynamicLoader_h +#define __cmDynamicLoader_h + +#include "cmStandardIncludes.h" + +// Ugly stuff for library handles +// They are different on several different OS's +#if defined(__hpux) +# include <dl.h> + typedef shl_t cmLibHandle; +#elif defined(_WIN32) + #include <windows.h> + typedef HMODULE cmLibHandle; +#else + typedef void* cmLibHandle; +#endif + +class cmDynamicLoader +{ +public: + // Description: + // Load a dynamic library into the current process. + // The returned cmLibHandle can be used to access the symbols in the + // library. + static cmLibHandle OpenLibrary(const char*); + + // Description: + // Attempt to detach a dynamic library from the + // process. A value of true is returned if it is successful. + static int CloseLibrary(cmLibHandle); + + // Description: + // Find the address of the symbol in the given library + static void* GetSymbolAddress(cmLibHandle, const char*); + + // Description: + // Return the library prefix for the given architecture + static const char* LibPrefix(); + + // Description: + // Return the library extension for the given architecture + static const char* LibExtension(); + + // Description: + // Return the last error produced from a calls made on this class. + static const char* LastError(); + +protected: + cmDynamicLoader() {}; + ~cmDynamicLoader() {}; + + +private: + cmDynamicLoader(const cmDynamicLoader&); // Not implemented. + void operator=(const cmDynamicLoader&); // Not implemented. +}; + +#endif |