php 动态链接库加载,手动加载动态链接库 - pirtt的个人空间 - OSCHINA - 中文开源技术交流社区...

#ifndef __PLUGIN__DYNAMICMGR_H_

#define __PLUGIN__DYNAMICMGR_H_

class DynamicMgr

{

public:

~DynamicMgr(){free_lib();}

/** */

const char* get_name()const;

/** */

bool load_lib(const char* libName);

/** */

void* get_address(const char* symbolMane)const;

private:

void free_lib();

std::string __m_libName;

#if defined(__unix__) || defined(unix) || defined(linux)

void*__m_lib;

#else

HMODULE __m_lib;

#endif

};

#endif

const char* DynamicMgr::get_name()const

{

return __m_libName.c_str();

}

/*************************************************************

* Unix System

**************************************************************/

#if defined(__unix__) || defined(unix) || defined(linux)

#include

bool DynamicMgr::load_lib(const char* libName)

{

std::string strName = libName;

strName += ".so";

__m_lib = dlopen(strName.c_str(),RTLD_LAZY);

if (__m_lib)

{

__m_libName = strName.substr(0,strName.length()-4);

}

return (__m_lib != 0);

}

void* DynamicMgr::get_address(const char* symbolMane)const

{

if (__m_lib)

{

return (void*)dlsym(__m_lib,symbolMane);

}

return NULL;

}

void DynamicMgr::free_lib()

{

if (__m_lib)

{

dlclose(__m_lib);

__m_lib = NULL;

}

}

#endif

/*************************************************************

* Windows System

**************************************************************/

#ifdef _WIN32

bool DynamicMgr::load_lib(const char* libName)

{

std::string strName = libName;

strName += ".dll";

__m_lib = LoadLibraryA(strName.c_str());

if (__m_lib)

{

__m_libName = strName.substr(0,strName.length()-4);

}

return (__m_lib != 0);

}

void* DynamicMgr::get_address(const char* symbolMane)const

{

if (__m_lib)

{

return (void*)GetProcAddress(__m_lib, symbolMane);// be careful __stdcall&&__cdecl

}

return NULL;

}

void DynamicMgr::free_lib()

{

if (__m_lib)

{

FreeLibrary(__m_lib);

__m_lib = NULL;

}

}

#endif