BsDynLib.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Utility/BsDynLib.h"
  4. #include "Error/BsException.h"
  5. #if BS_PLATFORM == BS_PLATFORM_WIN32
  6. #define WIN32_LEAN_AND_MEAN
  7. #if !defined(NOMINMAX) && defined(_MSC_VER)
  8. #define NOMINMAX // required to stop windows.h messing up std::min
  9. #endif
  10. #include <windows.h>
  11. #endif
  12. #if BS_PLATFORM == BS_PLATFORM_OSX
  13. #include <dlfcn.h>
  14. #endif
  15. namespace bs
  16. {
  17. #if BS_PLATFORM == BS_PLATFORM_LINUX
  18. const char* DynLib::EXTENSION = "so";
  19. #elif BS_PLATFORM == BS_PLATFORM_OSX
  20. const char* DynLib::EXTENSION = "dylib";
  21. #elif BS_PLATFORM == BS_PLATFORM_WIN32
  22. const char* DynLib::EXTENSION = "dll";
  23. #else
  24. #error Unhandled platform
  25. #endif
  26. DynLib::DynLib(const String& name)
  27. {
  28. mName = name;
  29. m_hInst = nullptr;
  30. load();
  31. }
  32. DynLib::~DynLib()
  33. {
  34. }
  35. void DynLib::load()
  36. {
  37. if (m_hInst)
  38. return;
  39. m_hInst = (DYNLIB_HANDLE)DYNLIB_LOAD(mName.c_str());
  40. if (!m_hInst)
  41. {
  42. BS_EXCEPT(InternalErrorException,
  43. "Could not load dynamic library " + mName +
  44. ". System Error: " + dynlibError());
  45. }
  46. }
  47. void DynLib::unload()
  48. {
  49. if (!m_hInst)
  50. return;
  51. if (DYNLIB_UNLOAD(m_hInst))
  52. {
  53. BS_EXCEPT(InternalErrorException,
  54. "Could not unload dynamic library " + mName +
  55. ". System Error: " + dynlibError());
  56. }
  57. }
  58. void* DynLib::getSymbol(const String& strName) const
  59. {
  60. if (!m_hInst)
  61. return nullptr;
  62. return (void*)DYNLIB_GETSYM(m_hInst, strName.c_str());
  63. }
  64. String DynLib::dynlibError()
  65. {
  66. #if BS_PLATFORM == BS_PLATFORM_WIN32
  67. LPVOID lpMsgBuf;
  68. FormatMessage(
  69. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  70. FORMAT_MESSAGE_FROM_SYSTEM |
  71. FORMAT_MESSAGE_IGNORE_INSERTS,
  72. NULL,
  73. GetLastError(),
  74. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  75. (LPTSTR)&lpMsgBuf,
  76. 0,
  77. NULL
  78. );
  79. String ret = (char*)lpMsgBuf;
  80. // Free the buffer.
  81. LocalFree(lpMsgBuf);
  82. return ret;
  83. #elif BS_PLATFORM == BS_PLATFORM_LINUX || BS_PLATFORM == BS_PLATFORM_OSX
  84. return String(dlerror());
  85. #else
  86. return String("");
  87. #endif
  88. }
  89. }