BsDynLib.cpp 2.5 KB

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