DLL.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. #if !WINDOWS
  4. #include <dlfcn.h>
  5. #endif
  6. namespace EE{
  7. #if WINDOWS_OLD
  8. #define MEMORY 1 // '2' didn't work on one computer when trying to run Ineisis Online
  9. #if MEMORY==1
  10. #include "../../../ThirdPartyLibs/MemoryModule/MemoryModule.c" // https://github.com/fancycode/MemoryModule
  11. #elif MEMORY==2
  12. #include "../../../ThirdPartyLibs/LoadDLL/LoadDLL.c" // https://www.codeproject.com/Tips/430684/Loading-Win-DLLs-manually-without-LoadLibrary
  13. #endif
  14. /******************************************************************************/
  15. void DLL::delForce()
  16. {
  17. HMODULE module=(HMODULE)_dll_file;
  18. del();
  19. if(module)REP(16)if(!FreeLibrary(module)){SetLastError(0); break;} // clear any errors that 'FreeLibrary' might have generated
  20. }
  21. DLL& DLL::del()
  22. {
  23. #if MEMORY==1
  24. if(_dll_mem ){MemoryFreeLibrary( _dll_mem ); _dll_mem =null;}
  25. #elif MEMORY==2
  26. if(_dll_mem ){ UnloadDLL((LOAD_DLL_INFO*)_dll_mem ); _dll_mem =null;}
  27. #endif
  28. if(_dll_file){ FreeLibrary((HMODULE )_dll_file); _dll_file=null;}
  29. return T;
  30. }
  31. Bool DLL::createMem(CPtr data, Int size)
  32. {
  33. del();
  34. if(data && size>0)
  35. {
  36. #if MEMORY==1
  37. _dll_mem=MemoryLoadLibrary(data, size);
  38. #elif MEMORY==2
  39. LOAD_DLL_INFO *dll=Alloc<LOAD_DLL_INFO>(); if(LoadDLLFromMemory(data, size, 0, dll)==ELoadDLLResult_OK)_dll_mem=dll;else Free(dll);
  40. #endif
  41. }
  42. return _dll_mem!=null;
  43. }
  44. Bool DLL::createFile(C Str &file) {return createFile(file());}
  45. Bool DLL::createFile(CChar *file)
  46. {
  47. del();
  48. _dll_file=LoadLibrary(WChar(file));
  49. return _dll_file!=null;
  50. }
  51. Ptr DLL::getFunc(CChar8 *name)C
  52. {
  53. #if MEMORY==1
  54. if(_dll_mem )return MemoryGetProcAddress( _dll_mem , name);
  55. #elif MEMORY==2
  56. if(_dll_mem )return myGetProcAddress_LoadDLLInfo((LOAD_DLL_INFO*)_dll_mem , name);
  57. #endif
  58. if(_dll_file)return GetProcAddress((HMODULE )_dll_file, name);
  59. return null;
  60. }
  61. #elif WINDOWS_NEW
  62. void DLL::delForce () {}
  63. DLL& DLL::del () {return T;}
  64. Bool DLL::createMem (CPtr data, Int size) {return false;}
  65. Bool DLL::createFile(C Str &file) {return false;}
  66. Bool DLL::createFile(CChar *file) {return false;}
  67. Ptr DLL::getFunc (CChar8 *name)C {return null;}
  68. #else
  69. void DLL::delForce()
  70. {
  71. del();
  72. }
  73. DLL& DLL::del()
  74. {
  75. if(_dll_file){dlclose(_dll_file); _dll_file=null;}
  76. return T;
  77. }
  78. Bool DLL::createMem(CPtr data, Int size)
  79. {
  80. del();
  81. return false;
  82. }
  83. Bool DLL::createFile(CChar *file) {return createFile(Str(file));}
  84. Bool DLL::createFile(C Str &file)
  85. {
  86. del();
  87. _dll_file=dlopen(UnixPathUTF8(file), RTLD_LAZY);
  88. return _dll_file!=null;
  89. }
  90. Ptr DLL::getFunc(CChar8 *name)C
  91. {
  92. if(_dll_file)return dlsym(_dll_file, name);
  93. return null;
  94. }
  95. #endif
  96. DLL::DLL() {_dll_mem=_dll_file=null;}
  97. Bool DLL::is()C
  98. {
  99. return _dll_mem || _dll_file;
  100. }
  101. /******************************************************************************/
  102. } // namespace
  103. /******************************************************************************/