1 module java.nonstandard.SharedLib; 2 3 import java.lang.all; 4 version(Tango){ 5 static import tango.sys.SharedLib; 6 static import tango.stdc.stringz; 7 } else { // Phobos 8 static import std..string; 9 10 private alias void* HXModule; 11 12 version(Windows){ 13 import core.sys.windows.windows; 14 import std.utf; 15 16 private HXModule ExeModule_Load(string name) { 17 return LoadLibraryW(toUTFz!(wchar*)(name)); 18 } 19 20 private void* ExeModule_GetSymbol(HXModule lib, string name) { 21 return GetProcAddress(lib, std..string.toStringz(name)); 22 } 23 24 private bool ExeModule_Release(ref HXModule lib) { 25 if (FreeLibrary(lib)) { 26 lib = null; 27 return true; 28 } else { 29 return false; 30 } 31 } 32 } else { // Posix 33 import core.sys.posix.dlfcn; 34 35 private HXModule ExeModule_Load(string name) { 36 return dlopen(std..string.toStringz(name), RTLD_NOW); 37 } 38 39 private void* ExeModule_GetSymbol(HXModule lib, string name) { 40 return dlsym(lib, std..string.toStringz(name)); 41 } 42 43 private bool ExeModule_Release(ref HXModule lib) { 44 if (0 == dlclose(lib)) { 45 lib = null; 46 return true; 47 } else { 48 return false; 49 } 50 } 51 } 52 } 53 54 struct Symbol { 55 String name; 56 void** symbol; 57 } 58 59 struct SymbolVersioned2 { 60 String name; 61 void** symbol; 62 int major; 63 int minor; 64 } 65 66 struct SharedLib { 67 static void loadLibSymbols( SymbolVersioned2[] symbols, String libname, int major, int minor ){ 68 version(Tango){ 69 if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) { 70 foreach( ref s; symbols ){ 71 if( s.major > major ) continue; 72 if( s.major == major && s.minor > minor ) continue; 73 *s.symbol = lib.getSymbol( tango.stdc.stringz.toStringz(s.name ) ); 74 if( s.symbol is null ){ 75 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); 76 } 77 } 78 } else { 79 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); 80 } 81 } else { // Phobos 82 if (auto lib = ExeModule_Load(libname)) { 83 foreach( ref s; symbols ){ 84 if( s.major > major ) continue; 85 if( s.major == major && s.minor > minor ) continue; 86 *s.symbol = ExeModule_GetSymbol( lib, s.name ); 87 if( s.symbol is null ){ 88 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); 89 } 90 } 91 } else { 92 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); 93 } 94 } 95 } 96 static void loadLibSymbols( Symbol[] symbols, String libname ){ 97 version(Tango){ 98 if (auto lib = tango.sys.SharedLib.SharedLib.loadNoThrow(libname)) { 99 foreach( ref s; symbols ){ 100 *s.symbol = lib.getSymbolNoThrow( tango.stdc.stringz.toStringz(s.name ) ); 101 if( *s.symbol is null ){ 102 //getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); 103 } 104 } 105 } else { 106 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); 107 } 108 } else { // Phobos 109 if (auto lib = ExeModule_Load(libname)) { 110 foreach( ref s; symbols ){ 111 *s.symbol = ExeModule_GetSymbol( lib, s.name ); 112 if( *s.symbol is null ){ 113 //getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); 114 } 115 } 116 } else { 117 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); 118 } 119 } 120 } 121 static bool tryUseSymbol( String symbolname, String libname, void delegate( void*) dg ){ 122 bool result = false; 123 version(Tango){ 124 if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) { 125 void* ptr = lib.getSymbol( tango.stdc.stringz.toStringz(symbolname)); 126 if (ptr !is null){ 127 dg(ptr); 128 result = true; 129 } 130 lib.unload(); 131 } 132 } else { // Phobos 133 if (auto lib = ExeModule_Load( libname ) ) { 134 void* ptr = ExeModule_GetSymbol( lib, symbolname ); 135 if (ptr !is null){ 136 dg(ptr); 137 result = true; 138 } 139 ExeModule_Release( lib ); 140 } 141 } 142 return result; 143 } 144 } 145 146