Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/module/DynLib.cc @ 11071

Last change on this file since 11071 was 11071, checked in by landauf, 8 years ago

merged branch cpp11_v3 back to trunk

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4    (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2006 Torus Knot Software Ltd
8Also see acknowledgements in Readme.html
9
10This program is free software; you can redistribute it and/or modify it under
11the terms of the GNU Lesser General Public License as published by the Free Software
12Foundation; either version 2 of the License, or (at your option) any later
13version.
14
15This program is distributed in the hope that it will be useful, but WITHOUT
16ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public License along with
20this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21Place - Suite 330, Boston, MA 02111-1307, USA, or go to
22http://www.gnu.org/copyleft/lesser.txt.
23
24You may alternatively use this source under the terms of a specific version of
25the OGRE Unrestricted License provided you have obtained such a license from
26Torus Knot Software Ltd.
27-----------------------------------------------------------------------------
28*/
29
30// 08/11/2009: Small adjustments for Orxonox by Fabian 'x3n' Landau
31
32#include "DynLib.h"
33
34#include "util/Exception.h"
35
36#ifdef ORXONOX_PLATFORM_WINDOWS
37#  define WIN32_LEAN_AND_MEAN
38#  ifndef NOMINMAX
39#    define NOMINMAX // required to stop windows.h messing up std::min
40#  endif
41#  include <windows.h>
42#endif
43
44#ifdef ORXONOX_PLATFORM_UNIX
45#  include <dlfcn.h>
46#endif
47
48#ifdef ORXONOX_PLATFORM_APPLE
49#   include <OSX/macUtils.h> // OGRE include
50#endif
51
52namespace orxonox
53{
54    //-----------------------------------------------------------------------
55    DynLib::DynLib( const std::string& name )
56    {
57        mName = name;
58        m_hInst = nullptr;
59    }
60
61    //-----------------------------------------------------------------------
62    DynLib::~DynLib()
63    {
64    }
65
66    //-----------------------------------------------------------------------
67    void DynLib::load()
68    {
69        // Log library load
70        orxout(internal_info) << "load DynLib " << mName << endl;
71
72        std::string name = mName;
73#ifdef ORXONOX_PLATFORM_LINUX
74        // dlopen() does not add .so to the filename, like windows does for .dll
75        if (name.substr(name.length() - 3, 3) != ".so")
76           name += ".so";
77#elif defined(ORXONOX_PLATFORM_APPLE)
78        // dlopen() does not add .dylib to the filename, like windows does for .dll
79        if (name.substr(name.length() - 6, 6) != ".dylib")
80            name += ".dylib";
81#elif defined(ORXONOX_PLATFORM_WINDOWS)
82        //altered search path doesn't work with paths with forward slashes
83        std::replace(name.begin(), name.end(), '/', '\\');
84        // Although LoadLibraryEx will add .dll itself when you only specify the library name,
85        // if you include a relative path then it does not. So, add it to be sure.
86        if (name.substr(name.length() - 4, 4) != ".dll")
87            name += ".dll";
88#endif
89
90        m_hInst = (DYNLIB_HANDLE)DYNLIB_LOAD( name.c_str() );
91
92        if (!m_hInst)
93            ThrowException(
94                General,
95                "Could not load dynamic library " + mName +
96                ".  System Error: " + dynlibError());
97    }
98
99    //-----------------------------------------------------------------------
100    void DynLib::unload()
101    {
102        // Log library unload
103        orxout(internal_info) << "unload DynLib " << mName << endl;
104
105        if (DYNLIB_UNLOAD( m_hInst ))
106        {
107            ThrowException(
108                General,
109                "Could not unload dynamic library " + mName +
110                ".  System Error: " + dynlibError());
111        }
112
113    }
114
115    //-----------------------------------------------------------------------
116    void* DynLib::getSymbol( const std::string& strName ) const throw()
117    {
118        return (void*)DYNLIB_GETSYM( m_hInst, strName.c_str() );
119    }
120    //-----------------------------------------------------------------------
121    std::string DynLib::dynlibError( void )
122    {
123#if defined(ORXONOX_PLATFORM_WINDOWS)
124        LPVOID lpMsgBuf;
125        FormatMessage(
126            FORMAT_MESSAGE_ALLOCATE_BUFFER |
127            FORMAT_MESSAGE_FROM_SYSTEM |
128            FORMAT_MESSAGE_IGNORE_INSERTS,
129            nullptr,
130            GetLastError(),
131            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
132            (LPTSTR) &lpMsgBuf,
133            0,
134            nullptr
135            );
136        std::string ret = (char*)lpMsgBuf;
137        // Free the buffer.
138        LocalFree( lpMsgBuf );
139        return ret;
140#elif defined(ORXONOX_PLATFORM_UNIX)
141        return std::string(dlerror());
142#else
143        return "";
144#endif
145    }
146}
Note: See TracBrowser for help on using the repository browser.