00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "MyGUI_Precompiled.h"
00025 #include "MyGUI_DynLib.h"
00026
00027 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
00028 # include <Windows.h>
00029 #elif MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX
00030 # include <dlfcn.h>
00031 #endif
00032
00033 namespace MyGUI
00034 {
00035 DynLib::DynLib( const std::string& name )
00036 {
00037 mName = name;
00038 mInstance = nullptr;
00039 }
00040
00041
00042 DynLib::~DynLib()
00043 {
00044 }
00045
00046
00047 bool DynLib::load()
00048 {
00049
00050 MYGUI_LOG(Info, "Loading library " << mName);
00051
00052 #if MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE
00053
00054 #else
00055 mInstance = (MYGUI_DYNLIB_HANDLE)MYGUI_DYNLIB_LOAD( mName.c_str() );
00056 #endif
00057
00058 return mInstance != 0;
00059 }
00060
00061
00062 void DynLib::unload()
00063 {
00064
00065 MYGUI_LOG(Info, "Unloading library " << mName);
00066 #if MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE
00067
00068 #else
00069 if (MYGUI_DYNLIB_UNLOAD(mInstance))
00070 {
00071 MYGUI_EXCEPT("Could not unload dynamic library '" << mName << "'. System Error: " << dynlibError());
00072 }
00073 #endif
00074 }
00075
00076 void* DynLib::getSymbol( const std::string& strName ) const throw()
00077 {
00078 #if MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE
00079
00080 return nullptr;
00081 #else
00082 return (void*)MYGUI_DYNLIB_GETSYM(mInstance, strName.c_str());
00083 #endif
00084 }
00085
00086 std::string DynLib::dynlibError( void )
00087 {
00088 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
00089 LPVOID lpMsgBuf;
00090 FormatMessage(
00091 FORMAT_MESSAGE_ALLOCATE_BUFFER |
00092 FORMAT_MESSAGE_FROM_SYSTEM |
00093 FORMAT_MESSAGE_IGNORE_INSERTS,
00094 NULL,
00095 GetLastError(),
00096 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00097 (LPTSTR) &lpMsgBuf,
00098 0,
00099 NULL
00100 );
00101 std::string ret = (char*)lpMsgBuf;
00102
00103 LocalFree( lpMsgBuf );
00104 return ret;
00105 #else
00106 return "no unix error function defined yet";
00107 #endif
00108 }
00109
00110 }