懐かしさ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(); //全ての命令を実行
};