INTRODUCTION Overview Download and Install Quick Start Documentation Publications NONFRAMEWORK CODE Driver Interfaces Drivers Libraries Utilities FRAMEWORK CODE Interfaces Components Libraries Utilities Full Software Listings DEVELOPER Tutorials Examples Dev Guide Dashboard PEOPLE Contributors Users Project Download Mailing lists
|
dynamicload.h00001 /* 00002 * Orca-Robotics Project: Components for robotics 00003 * http://orca-robotics.sf.net/ 00004 * Copyright (c) 2004-2009 Alex Brooks, Alexei Makarenko, Tobias Kaupp 00005 * 00006 * This distribution is licensed to you under the terms described in 00007 * the LICENSE file included in this distribution. 00008 * 00009 */ 00010 00011 #ifndef HYDRO_DYNAMICLOAD_DYNAMICLOAD_H 00012 #define HYDRO_DYNAMICLOAD_DYNAMICLOAD_H 00013 00014 #include <hydrodll/dll.h> 00015 #include <hydrodll/exceptions.h> 00016 #ifndef WIN32 00017 #include <dlfcn.h> 00018 #else 00019 #include <windows.h> 00020 #endif 00021 #include <string> 00022 #include <sstream> 00023 00024 namespace hydrodll 00025 { 00026 00039 template<class LoadedClass, typename MakerFunc> 00040 LoadedClass *dynamicallyLoadClass( DynamicallyLoadedLibrary &lib, const char *makerFuncName ) 00041 { 00042 #ifndef WIN32 00043 void *makerFuncHandle = dlsym(lib.handle(),makerFuncName); 00044 if ( makerFuncHandle == NULL ) 00045 { 00046 std::stringstream ss; 00047 ss << "Failed to find symbol '"<<makerFuncName<<"' in library '"<<lib.name()<<"': "<<dlerror(); 00048 throw DynamicLoadException( ss.str() ); 00049 } 00050 #else 00051 void *makerFuncHandle = (void*)GetProcAddress((HMODULE)lib.handle(),makerFuncName); 00052 if ( makerFuncHandle == NULL ) 00053 { 00054 std::stringstream ss; 00055 ss << "Failed to find symbol '"<<makerFuncName<<"' in library '"<<lib.name()<<"': "<<GetLastError(); 00056 throw DynamicLoadException( ss.str() ); 00057 } 00058 #endif 00059 00060 MakerFunc *makerFunc = (MakerFunc*)makerFuncHandle; 00061 00062 LoadedClass *loadedClass = makerFunc(); 00063 return loadedClass; 00064 }; 00065 00066 } // namespace 00067 00068 #endif |
Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)