📄 dll_object_manger.h
字号:
#ifndef __HBSTOCK2_DllObjectManger_H__
#define __HBSTOCK2_DllObjectManger_H__
#include <map>
#include <set>
#include <memory>
#include <ace/DLL.h>
#include <ace/Refcounted_Auto_Ptr.h>
#include "gnu/app_config.h"
#include "gnu/usage_tool.h"
#include "hbstock2/data_config.h"
#include "hbstock2/hbstock_exception.h"
namespace hbstock2
{
/**
* DllObjectPtrSort used as parameter of set.
* typedef std::set<DllObjectPtr,DllObjectPtrSort<T> > SetDllObject;
*/
template <class T>
class DllObjectPtrSort
{
public:
bool operator() (const ACE_Refcounted_Auto_Ptr<T,Hbstock_Mutex> object_ptr1,
const ACE_Refcounted_Auto_Ptr<T,Hbstock_Mutex> object_ptr2) const
{
return (object_ptr1->get_name() < object_ptr2->get_name());
}
};
template <typename T>
class DllObjectManger
{
public :
typedef ACE_Refcounted_Auto_Ptr<T,Hbstock_Mutex> DllObjectPtr;
typedef std::set<DllObjectPtr,DllObjectPtrSort<T> > SetDllObject;
typedef ACE_Refcounted_Auto_Ptr<SetDllObject,Hbstock_Mutex> SetDllObjectPtr;
typedef typename std::set<DllObjectPtr,DllObjectPtrSort<T> >::iterator SetDllObject_Iterator;
public :
DllObjectManger();
virtual ~DllObjectManger() throw();
/** dynamic load dllobject from default directory.
* if you want to create a new object , you must Specialize this function.
*/
int load_dllobject_from_default_dir()
{
int i_ret = 0;
if (m_set_dllobj_ptr->size() == 0)
{
// init data loader
gnu::AppConfig* p_app_config = gnu::AppConfigInst::instance();
strcpy(m_p_ch_default_dir,p_app_config->get_root_dir().c_str());
strcat(m_p_ch_default_dir,"/plugin/selector");
memset(m_p_ch_file_prefix_default,0,sizeof(m_p_ch_file_prefix_default));
strcpy(m_p_ch_file_prefix_default,"slt_");
strcpy(m_p_ch_symbolname,"maker_selector");
i_ret = load_dllobject_from_dir(m_p_ch_default_dir,m_p_ch_file_prefix_default);
}
return i_ret;
}
// dynamic load dllobject
int load_dllobject_from_dir(const char* p_ch_dir,const char* p_file_prefix=NULL);
int load_dllobject_from_file(const char* p_ch_filename);
// init and finit
virtual int init (int argc, char *argv[]);
virtual int fini (void);
virtual void print_info() const;
bool register_dllobject(const DllObjectPtr& obj_ptr);
bool unregister_dllobject(unsigned int obj_id);
unsigned int get_dllobject_id(const char* p_ch_obj_name);
void set_default_dllobject(const DllObjectPtr& obj_ptr);
DllObjectPtr get_default_dllobject();
DllObjectPtr get_dllobject(unsigned int obj_id) const;
SetDllObjectPtr get_all_dllobject() const
{
return m_set_dllobj_ptr;
}
protected:
void* load_dllobject(const char* p_ch_filename,const char* symbolname) throw (hbstock2::hbstock_exception);
//set symbolname
void set_symbol_name(const char* p_ch_symbolname);
const char* get_symbol_name();
private:
DllObjectManger(const DllObjectManger& other);
DllObjectManger& operator=(const DllObjectManger& other);
private:
std::map<std::string,gnu::ACE_DLL_Ptr> m_map_dll_loader;
SetDllObjectPtr m_set_dllobj_ptr;
DllObjectPtr m_object_ptr;
DllObjectPtr m_default_object_ptr;
char m_p_ch_default_dir[LEN_FILENAME];
char m_p_ch_file_prefix_default[LEN_FILENAME];
char m_p_ch_symbolname[LEN_FILENAME];
bool m_is_inited ;
};
} // namespace hbstock2
// used to implement template
#include "hbstock2/dll_object_manger_def.h"
#endif // #ifndef __HBSTOCK2_DllObjectManger_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -