cmDynamicLoader.cxx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /*=========================================================================
  2. Program: Insight Segmentation & Registration Toolkit
  3. Module: $RCSfile$
  4. Language: C++
  5. Date: $Date$
  6. Version: $Revision$
  7. Copyright (c) 2002 Insight Consortium. All rights reserved.
  8. See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
  9. This software is distributed WITHOUT ANY WARRANTY; without even
  10. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. PURPOSE. See the above copyright notices for more information.
  12. =========================================================================*/
  13. #include "cmDynamicLoader.h"
  14. // This file is actually 3 different implementations.
  15. // 1. HP machines which uses shl_load
  16. // 2. Apple OSX which uses NSLinkModule
  17. // 3. Windows which uses LoadLibrary
  18. // 4. Most unix systems which use dlopen (default )
  19. // Each part of the ifdef contains a complete implementation for
  20. // the static methods of cmDynamicLoader.
  21. // ---------------------------------------------------------------
  22. // 1. Implementation for HPUX machines
  23. #ifdef __hpux
  24. #define CMDYNAMICLOADER_DEFINED 1
  25. #include <dl.h>
  26. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  27. {
  28. return shl_load(libname, BIND_DEFERRED | DYNAMIC_PATH, 0L);
  29. }
  30. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  31. {
  32. return 0;
  33. }
  34. void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
  35. {
  36. void* addr;
  37. int status;
  38. status = shl_findsym (&lib, sym, TYPE_PROCEDURE, &addr);
  39. return (status < 0) ? (void*)0 : addr;
  40. }
  41. const char* cmDynamicLoader::LibPrefix()
  42. {
  43. return "lib";
  44. }
  45. const char* cmDynamicLoader::LibExtension()
  46. {
  47. return ".sl";
  48. }
  49. const char* cmDynamicLoader::LastError()
  50. {
  51. return 0;
  52. }
  53. #endif
  54. // ---------------------------------------------------------------
  55. // 2. Implementation for Darwin (including OSX) Machines
  56. #ifdef __APPLE__
  57. #define CMDYNAMICLOADER_DEFINED
  58. #include <mach-o/dyld.h>
  59. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  60. {
  61. NSObjectFileImageReturnCode rc;
  62. NSObjectFileImage image;
  63. rc = NSCreateObjectFileImageFromFile(libname, &image);
  64. return NSLinkModule(image, libname, TRUE);
  65. }
  66. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  67. {
  68. return 0;
  69. }
  70. void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
  71. {
  72. void *result=0;
  73. if(NSIsSymbolNameDefined(sym)){
  74. cout << sym << " is defined!" << endl;
  75. NSSymbol symbol= NSLookupAndBindSymbol(sym);
  76. if(symbol){
  77. result = NSAddressOfSymbol(symbol);
  78. }
  79. }else{
  80. cout << sym << " is not defined!" << endl;
  81. }
  82. return result;
  83. }
  84. const char* cmDynamicLoader::LibPrefix()
  85. {
  86. return "";
  87. }
  88. const char* cmDynamicLoader::LibExtension()
  89. {
  90. return ".dylib";
  91. }
  92. const char* cmDynamicLoader::LastError()
  93. {
  94. return 0;
  95. }
  96. #endif
  97. // ---------------------------------------------------------------
  98. // 3. Implementation for Windows win32 code
  99. #ifdef _WIN32
  100. #include <windows.h>
  101. #define CMDYNAMICLOADER_DEFINED 1
  102. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  103. {
  104. #ifdef UNICODE
  105. wchar_t *libn = new wchar_t [mbstowcs(NULL, libname, 32000)];
  106. mbstowcs(libn, libname, 32000);
  107. cmLibHandle ret = LoadLibrary(libn);
  108. delete [] libn;
  109. return ret;
  110. #else
  111. return LoadLibrary(libname);
  112. #endif
  113. }
  114. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  115. {
  116. return (int)FreeLibrary(lib);
  117. }
  118. void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
  119. {
  120. #ifdef UNICODE
  121. wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)];
  122. mbstowcs(wsym, sym, 32000);
  123. void *ret = GetProcAddress(lib, wsym);
  124. delete [] wsym;
  125. return ret;
  126. #else
  127. return GetProcAddress(lib, sym);
  128. #endif
  129. }
  130. const char* cmDynamicLoader::LibPrefix()
  131. {
  132. return "";
  133. }
  134. const char* cmDynamicLoader::LibExtension()
  135. {
  136. return ".dll";
  137. }
  138. const char* cmDynamicLoader::LastError()
  139. {
  140. LPVOID lpMsgBuf;
  141. FormatMessage(
  142. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  143. NULL,
  144. GetLastError(),
  145. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  146. (LPTSTR) &lpMsgBuf,
  147. 0,
  148. NULL
  149. );
  150. // Free the buffer.
  151. LocalFree( lpMsgBuf );
  152. static char* str = 0;
  153. delete [] str;
  154. str = strcpy(new char[strlen((char*)lpMsgBuf)+1], (char*)lpMsgBuf);
  155. return str;
  156. }
  157. #endif
  158. // ---------------------------------------------------------------
  159. // 4. Implementation for default UNIX machines.
  160. // if nothing has been defined then use this
  161. #ifndef CMDYNAMICLOADER_DEFINED
  162. #define CMDYNAMICLOADER_DEFINED
  163. // Setup for most unix machines
  164. #include <dlfcn.h>
  165. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  166. {
  167. return dlopen(libname, RTLD_LAZY);
  168. }
  169. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  170. {
  171. return (int)dlclose(lib);
  172. }
  173. void* cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
  174. {
  175. return dlsym(lib, sym);
  176. }
  177. const char* cmDynamicLoader::LibPrefix()
  178. {
  179. return "lib";
  180. }
  181. const char* cmDynamicLoader::LibExtension()
  182. {
  183. return ".so";
  184. }
  185. const char* cmDynamicLoader::LastError()
  186. {
  187. return dlerror();
  188. }
  189. #endif