65,190
社区成员




#ifndef PLUGINSTORE_H
#define PLUGINSTORE_H
#include <vector>
#include <string>
using namespace std;
template <class T>
class CPluginStore
{
public:
typedef T* (*PFUN_CREATE_OBJ)(int nIndex,void *pParam);
typedef struct _PLUGIN_INFO
{
PFUN_CREATE_OBJ pfCreateObj;
HMODULE hModule;
}PLUGIN_INFO;
public:
CPluginStore();
virtual ~CPluginStore();
bool AddPlugin(std::string strDll);
bool GetNext(PLUGIN_INFO &pi,bool bNext=true);
private:
vector<PLUGIN_INFO> m_plugVec;
vector<PLUGIN_INFO>::iterator m_plugIter;
};
template <class T>
CPluginStore<T>::CPluginStore()
{
}
template <class T>
CPluginStore<T>::~CPluginStore()
{
for (int i=0;i<m_plugVec.size();i++)
FreeLibrary(m_plugVec[i].hModule);
}
template <class T>
bool CPluginStore<T>::AddPlugin(std::string strDll)
{
PLUGIN_INFO pi;
pi.hModule=::LoadLibrary(strDll.c_str());
if (NULL==pi.hModule)
return false;
pi.pfCreateObj=(PFUN_CREATE_OBJ)::GetProcAddress(pi.hModule,"CreateObj");
if (NULL==pi.pfCreateObj)
{
FreeLibrary(pi.hModule);
return false;
}
m_plugVec.push_back(pi);
return true;
}
template <class T>
bool CPluginStore<T>::GetNext(PLUGIN_INFO &pi,bool bNext)
{
if (bNext)
m_plugIter++;
else
m_plugIter=m_plugVec.begin();
if (m_plugIter==m_plugVec.end())
return false;
pi=*m_plugIter;
return true;
}
#endif//PLUGINSTORE_H
#ifndef PLUGINSTORE_H
#define PLUGINSTORE_H
#include <vector>
#include <string>
using namespace std;
template <class T>
class CPluginStore
{
public:
typedef T* (*PFUN_CREATE_OBJ)(int nIndex,void *pParam);
typedef struct _PLUGIN_INFO
{
PFUN_CREATE_OBJ pfCreateObj;
HMODULE hModule;
}PLUGIN_INFO;
typedef typename vector<PLUGIN_INFO>::iterator PluginInfoIter;
public:
CPluginStore();
virtual ~CPluginStore();
bool AddPlugin(std::string strDll);
bool GetNext(PLUGIN_INFO &pi,bool bNext=true);
private:
vector<PLUGIN_INFO> m_plugVec;
// vector<PLUGIN_INFO>::iterator m_plugIter;
vector<PluginInfoIter> m_plugIter;
};
template <class T>
CPluginStore<T>::CPluginStore()
{
}
template <class T>
CPluginStore<T>::~CPluginStore()
{
for (int i=0;i<m_plugVec.size();i++)
FreeLibrary(m_plugVec[i].hModule);
}
template <class T>
bool CPluginStore<T>::AddPlugin(std::string strDll)
{
PLUGIN_INFO pi;
pi.hModule=::LoadLibrary(strDll.c_str());
if (NULL==pi.hModule)
return false;
pi.pfCreateObj=(PFUN_CREATE_OBJ)::GetProcAddress(pi.hModule,"CreateObj");
if (NULL==pi.pfCreateObj)
{
FreeLibrary(pi.hModule);
return false;
}
m_plugVec.push_back(pi);
return true;
}
template <class T>
bool CPluginStore<T>::GetNext(PLUGIN_INFO &pi,bool bNext)
{
if (bNext)
m_plugIter++;
else
m_plugIter=m_plugVec.begin();
if (m_plugIter==m_plugVec.end())
return false;
pi=*m_plugIter;
return true;
}
#endif//PLUGINSTORE_H