懐かしさ90%
懐かしさ90%
/*基幹システム・関数ポインタによる処理実行クラス*/#pragma once#include <windows.h>//規定!//Exe関数は引数なしのint関数で無ければならない(intはエラーコードを還すのね)。//ジョブstruct LBLFunc {typedef int (*PF)(void); //命令への関数ポインタPF pfunc; //LBLFunc* next; //次の命令virtual int Do(){ return pfunc(); }; //関数実行LBLFunc::LBLFunc(){pfunc = NULL;next = NULL;};};template<typename T> struct LBLMFunc : LBLFunc {typedef int (T::*PMF)(void); //命令への関数ポインタの定義PMF pmfunc; //関数ポインタT* Class; //クラスのポインタLBLFunc* next; //次の命令へint Do(){ return (Class->*pmfunc)(); }; //関数実行LBLMFunc(T* c, PMF pmf) : LBLFunc(){Class = c;pmfunc = pmf;next = NULL;};};/*登録クラス*/class LBLFuncRegister {LBLFunc* fstFunc; //最初の命令LBLFunc* lstFunc; //最後の命令long m_Stacks; //命令数public:LBLFuncRegister(int (*pfunc)(void));~LBLFuncRegister();enum{MAX_FUNC = 1024 //最大命令数は1024};LPCVOID AddRegist(int (*pfunc)(void)); //命令の登録(関数は名前があればポインタを解決できる)//命令の登録(メンバ関数は名前はオブジェクトと関数ポインタの両方を渡して登録)template<typename T>LPCVOID AddRegist(int (T::*pmfunc)(), T* c){LBLFunc* pLBLfunc = new LBLMFunc<T>(c,pmfunc);pLBLfunc->next = NULL; //次は無いlstFunc->next = pLBLfunc; //最後の命令の次はこれ。lstFunc = pLBLfunc; //最後の命令を更新。return pLBLfunc;};void DelAll(); //全ての命令の削除bool DelRegist(LPCVOID pfuncAddress); //命令の削除(登録時のアドレスからピンポイントで消す)void DelRegist(int (*pdelfunc)(void)); //命令の削除(関数すべてを排除)void ChkError(int error_code); //エラーコードからエラーの内容を還すvoid exe(); //全ての命令を実行};