1 module mutils.plugin.load_lib; 2 3 alias void* SharedLibHandle; 4 5 import core.stdc.string; 6 7 char[256] charBuffer; 8 9 version(Posix) { 10 import core.sys.posix.dlfcn; 11 SharedLibHandle LoadSharedLib(string libName) nothrow @nogc 12 { 13 assert(libName.length<charBuffer.length); 14 charBuffer[libName.length]='\0'; 15 charBuffer[0..libName.length]=libName[0..libName.length]; 16 return dlopen(charBuffer.ptr, RTLD_LOCAL | RTLD_NOW); 17 } 18 19 void UnloadSharedLib(SharedLibHandle hlib) nothrow @nogc 20 { 21 dlclose(hlib); 22 } 23 24 void* GetSymbol(SharedLibHandle hlib, string symbolName) nothrow @nogc 25 { 26 assert(symbolName.length<charBuffer.length); 27 charBuffer[symbolName.length]='\0'; 28 charBuffer[0..symbolName.length]=symbolName[0..symbolName.length]; 29 return dlsym(hlib, charBuffer.ptr); 30 } 31 32 string GetErrorStr() nothrow @nogc 33 { 34 35 char* err = cast(char*)dlerror(); 36 if(err is null) 37 return null; 38 39 return cast(string)err[0..strlen(err)]; 40 } 41 42 } else version(Windows){ 43 import core.sys.windows.windows; 44 45 SharedLibHandle LoadSharedLib(string libName) 46 { 47 assert(libName.length<charBuffer.length); 48 charBuffer[libName.length]='\0'; 49 charBuffer[0..libName.length]=libName[0..libName.length]; 50 return LoadLibraryA(charBuffer.ptr); 51 } 52 53 void UnloadSharedLib(SharedLibHandle hlib) 54 { 55 FreeLibrary(hlib); 56 } 57 58 void* GetSymbol(SharedLibHandle hlib, string symbolName) 59 { 60 assert(symbolName.length<charBuffer.length); 61 charBuffer[symbolName.length]='\0'; 62 charBuffer[0..symbolName.length]=symbolName[0..symbolName.length]; 63 return GetProcAddress(hlib, charBuffer.ptr ); 64 } 65 66 string GetErrorStr() 67 { 68 import std.windows.syserror; 69 return sysErrorString(GetLastError()); 70 } 71 72 }else{ 73 static assert(false, "Platform not supported"); 74 }