加载动态库
#ifndef __PUBLIC_LOADLIBRARY_H__
#define __PUBLIC_LOADLIBRARY_H__
#ifdef WIN32
#include <Windows.h>
#else
#include <dlfcn.h>
#endif
#include <string>
#include "pub_utility_api/UtilityCommon.h"
namespace kbd_public
{
/*
@brief 动态库加载类
*/
class PUB_UTILITY_API CLoadLibrary
{
public:
CLoadLibrary();
virtual ~CLoadLibrary();
/*
@brief 获取函数指针
@param const std::string & strFuncName 函数名
*/
virtual void *findFunction(const std::string &strFuncName) const;
/*
@brief 加载动态库
@param const std::string & strLibFileName 动态库文件名
@return 加载成功返回true,失败返回false
*/
virtual bool load(const std::string &strLibFileName);
/*
@brief 卸载动态库
@return 卸载成功返回true
*/
virtual bool unload();
private:
#ifdef WIN32
HMODULE m_hLib; //< 动态库句柄
#else
void *m_hLib; //< 动态库句柄
#endif
};
} //namespace BASE
#endif // __PUBLIC_LOADLIBRARY_H__
#include "pub_utility_api/LoadLibrary.h"
#include "pub_logger_api/logger.h"
using namespace kbd_public;
kbd_public::CLoadLibrary::CLoadLibrary() :m_hLib(NULL)
{
}
kbd_public::CLoadLibrary::~CLoadLibrary()
{
unload();
}
void * kbd_public::CLoadLibrary::findFunction(const std::string &strFuncName) const
{
if (NULL == m_hLib || strFuncName.empty())
{
return NULL;
}
#ifdef WIN32
return ::GetProcAddress(m_hLib, strFuncName.c_str());
#else
return dlsym(m_hLib, strFuncName.c_str());
#endif
}
bool kbd_public::CLoadLibrary::load(const std::string &strLibFileName)
{
unload();
#ifdef WIN32
m_hLib = ::LoadLibraryA(strLibFileName.c_str());
if (m_hLib == NULL)
{
LOGERROR("LoadLibraryA Error=%d", GetLastError());
}
#else
int flags = RTLD_NOW | RTLD_GLOBAL;
#ifdef _AIX
flags |= RTLD_MEMBER;
#endif
m_hLib = dlopen(strLibFileName.c_str(), flags);
if (m_hLib == NULL)
{
LOGERROR("dlopen err:%s.\n", dlerror());
}
#endif
return (m_hLib != NULL);
}
bool kbd_public::CLoadLibrary::unload()
{
if (m_hLib == NULL)
{
return true;
}
#ifdef WIN32
if (FreeLibrary(m_hLib))
{
m_hLib = NULL;
return true;
}
else
{
return false;
}
#else
if (0 == dlclose(m_hLib))
{
m_hLib = NULL;
return true;
}
else
{
LOGERROR("dlclose err:%s.\n", dlerror());
return false;
}
#endif
}
#ifndef __PUBLIC_UTILITYCOMMON_H__
#define __PUBLIC_UTILITYCOMMON_H__
#include "Export.h"
#ifdef PUB_UTILITY_EXPORTS
#define PUB_UTILITY_API G_DECL_EXPORT
#else
#define PUB_UTILITY_API G_DECL_IMPORT
#endif
#endif // __PUBLIC_UTILITYCOMMON_H__