Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/cpp11/src/libraries/core/DynLib.cc @ 10443

Last change on this file since 10443 was 10295, checked in by muemart, 10 years ago

Avoid using the system path variables on windows (also gets rid of two MSVC warnings)
The altered search path already includes the dll's directory, but it didn't work with forward slashes

  • 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#if defined(ORXONOX_PLATFORM_WINDOWS)
59        //altered search path doesn't work with paths with forward slashes
60        std::replace(mName.begin(), mName.end(), '/', '\\');
61#endif
62        m_hInst = NULL;
63    }
64
65    //-----------------------------------------------------------------------
66    DynLib::~DynLib()
67    {
68    }
69
70    //-----------------------------------------------------------------------
71    void DynLib::load()
72    {
73        // Log library load
74        orxout(internal_info) << "Loading module " << mName << endl;
75
76        std::string name = mName;
77#ifdef ORXONOX_PLATFORM_LINUX
78        // dlopen() does not add .so to the filename, like windows does for .dll
79        if (name.substr(name.length() - 3, 3) != ".so")
80           name += ".so";
81#elif defined(ORXONOX_PLATFORM_APPLE)
82        // dlopen() does not add .dylib to the filename, like windows does for .dll
83        if (name.substr(name.length() - 6, 6) != ".dylib")
84            name += ".dylib";
85#elif defined(ORXONOX_PLATFORM_WINDOWS)
86        // Although LoadLibraryEx will add .dll itself when you only specify the library name,
87        // if you include a relative path then it does not. So, add it to be sure.
88        if (name.substr(name.length() - 4, 4) != ".dll")
89            name += ".dll";
90#endif
91
92        m_hInst = (DYNLIB_HANDLE)DYNLIB_LOAD( name.c_str() );
93
94        if (!m_hInst)
95            ThrowException(
96                General,
97                "Could not load dynamic library " + mName +
98                ".  System Error: " + dynlibError());
99    }
100
101    //-----------------------------------------------------------------------
102    void DynLib::unload()
103    {
104        // Log library unload
105        orxout(internal_info) << "Unloading module " << mName << endl;
106
107        if (DYNLIB_UNLOAD( m_hInst ))
108        {
109            ThrowException(
110                General,
111                "Could not unload dynamic library " + mName +
112                ".  System Error: " + dynlibError());
113        }
114
115    }
116
117    //-----------------------------------------------------------------------
118    void* DynLib::getSymbol( const std::string& strName ) const throw()
119    {
120        return (void*)DYNLIB_GETSYM( m_hInst, strName.c_str() );
121    }
122    //-----------------------------------------------------------------------
123    std::string DynLib::dynlibError( void )
124    {
125#if defined(ORXONOX_PLATFORM_WINDOWS)
126        LPVOID lpMsgBuf;
127        FormatMessage(
128            FORMAT_MESSAGE_ALLOCATE_BUFFER |
129            FORMAT_MESSAGE_FROM_SYSTEM |
130            FORMAT_MESSAGE_IGNORE_INSERTS,
131            NULL,
132            GetLastError(),
133            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
134            (LPTSTR) &lpMsgBuf,
135            0,
136            NULL
137            );
138        std::string ret = (char*)lpMsgBuf;
139        // Free the buffer.
140        LocalFree( lpMsgBuf );
141        return ret;
142#elif defined(ORXONOX_PLATFORM_UNIX)
143        return std::string(dlerror());
144#else
145        return "";
146#endif
147    }
148}
Note: See TracBrowser for help on using the repository browser.