2
0

BsDynLib.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. const char* DynLib::PREFIX = "lib";
  20. #elif BS_PLATFORM == BS_PLATFORM_OSX
  21. const char* DynLib::EXTENSION = "dylib";
  22. const char* DynLib::PREFIX = "lib";
  23. #elif BS_PLATFORM == BS_PLATFORM_WIN32
  24. const char* DynLib::EXTENSION = "dll";
  25. const char* DynLib::PREFIX = nullptr;
  26. #else
  27. #error Unhandled platform
  28. #endif
  29. DynLib::DynLib(const String& name)
  30. {
  31. mName = name;
  32. mHandle = nullptr;
  33. load();
  34. }
  35. DynLib::~DynLib()
  36. {
  37. }
  38. void DynLib::load()
  39. {
  40. if (mHandle)
  41. return;
  42. mHandle = (DYNLIB_HANDLE)DYNLIB_LOAD(mName.c_str());
  43. if (!mHandle)
  44. {
  45. BS_EXCEPT(InternalErrorException,
  46. "Could not load dynamic library " + mName +
  47. ". System Error: " + dynlibError());
  48. }
  49. }
  50. void DynLib::unload()
  51. {
  52. if (!mHandle)
  53. return;
  54. if (DYNLIB_UNLOAD(mHandle))
  55. {
  56. BS_EXCEPT(InternalErrorException,
  57. "Could not unload dynamic library " + mName +
  58. ". System Error: " + dynlibError());
  59. }
  60. }
  61. void* DynLib::getSymbol(const String& strName) const
  62. {
  63. if (!mHandle)
  64. return nullptr;
  65. return (void*)DYNLIB_GETSYM(mHandle, strName.c_str());
  66. }
  67. String DynLib::dynlibError()
  68. {
  69. #if BS_PLATFORM == BS_PLATFORM_WIN32
  70. LPVOID lpMsgBuf;
  71. FormatMessage(
  72. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  73. FORMAT_MESSAGE_FROM_SYSTEM |
  74. FORMAT_MESSAGE_IGNORE_INSERTS,
  75. NULL,
  76. GetLastError(),
  77. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  78. (LPTSTR)&lpMsgBuf,
  79. 0,
  80. NULL
  81. );
  82. String ret = (char*)lpMsgBuf;
  83. // Free the buffer.
  84. LocalFree(lpMsgBuf);
  85. return ret;
  86. #elif BS_PLATFORM == BS_PLATFORM_LINUX || BS_PLATFORM == BS_PLATFORM_OSX
  87. return String(dlerror());
  88. #else
  89. return String("");
  90. #endif
  91. }
  92. }