⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dll_object_manger.h

📁 股票分析源代码
💻 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 + -