📄 xevent.h
字号:
#pragma once
template < class T >
inline LPVOID ThisCall0( T func, LPVOID pThis )
{
__asm mov ecx, pThis
//__asm push eax
__asm call dword ptr[func]
}
template < class T, class Tp1 >
inline LPVOID ThisCall1( T func, LPVOID pThis, Tp1 lpParam1 )
{
__asm push dword ptr[lpParam1]
__asm mov ecx, pThis
//__asm push eax
__asm call dword ptr[func]
}
template < class T, class Tp1, class Tp2 >
inline LPVOID ThisCall2( T func, LPVOID pThis, Tp1 lpParam1, Tp2 lpParam2 )
{
__asm push dword ptr[lpParam2]
__asm push dword ptr[lpParam1]
__asm mov ecx, pThis
//__asm push eax
__asm call dword ptr[func]
}
template < class T, class Tp1, class Tp2, class Tp3 >
inline LPVOID ThisCall3( T func, LPVOID pThis, Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3 )
{
__asm push dword ptr[lpParam3]
__asm push dword ptr[lpParam2]
__asm push dword ptr[lpParam1]
__asm mov ecx, pThis
//__asm push eax
__asm call dword ptr[func]
}
template < class T, class Tp1, class Tp2, class Tp3, class Tp4 >
inline LPVOID ThisCall4( T func, LPVOID pThis, Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3, Tp4 lpParam4 )
{
__asm push dword ptr[lpParam4]
__asm push dword ptr[lpParam3]
__asm push dword ptr[lpParam2]
__asm push dword ptr[lpParam1]
__asm mov ecx, pThis
//__asm push eax
__asm call dword ptr[func]
}
template < class T, class Tp1, class Tp2, class Tp3, class Tp4, class Tp5 >
inline LPVOID ThisCall5( T func, LPVOID pThis, Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3, Tp4 lpParam4, Tp5 lpParam5 )
{
__asm push dword ptr[lpParam5]
__asm push dword ptr[lpParam4]
__asm push dword ptr[lpParam3]
__asm push dword ptr[lpParam2]
__asm push dword ptr[lpParam1]
__asm mov ecx, pThis
//__asm push eax
__asm call dword ptr[func]
}
template < class T >
inline LPVOID F2P( T func )
{
__asm mov eax, dword ptr[func];
}
class xEvent
{
public:
xEvent()
{
m_lpThis = NULL;
m_lpFunc = NULL;
}
template <class T>
xEvent(LPVOID lpThis, T func)
{
m_lpThis = lpThis;
m_lpFunc = F2P(func);
}
LPVOID getThisPtr(){ return m_lpThis;}
VOID setThisPtr( LPVOID lpThis ){ m_lpThis = lpThis;}
LPVOID getFuncPtr(){ return m_lpFunc;}
template <class T> VOID setFuncPtr( T func ){ m_lpFunc = F2P( func );}
LPVOID call()
{
if( !Assigned() )return NULL;
return ThisCall0( m_lpFunc, m_lpThis );
}
template < class Tp1 >
LPVOID call( Tp1 lpParam1 )
{
if( !Assigned() )return NULL;
return ThisCall1( m_lpFunc, m_lpThis, lpParam1 );
}
template < class Tp1, class Tp2 >
LPVOID call( Tp1 lpParam1, Tp2 lpParam2 )
{
if( !Assigned() )return NULL;
return ThisCall2( m_lpFunc, m_lpThis, lpParam1, lpParam2 );
}
template < class Tp1, class Tp2, class Tp3 >
LPVOID call( Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3 )
{
if( !Assigned() )return NULL;
return ThisCall3( m_lpFunc, m_lpThis, lpParam1, lpParam2, lpParam3 );
}
template < class Tp1, class Tp2, class Tp3, class Tp4 >
LPVOID call( Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3, Tp4 lpParam4 )
{
if( !Assigned() )return NULL;
return ThisCall4( m_lpFunc, m_lpThis, lpParam1, lpParam2, lpParam3, lpParam4 );
}
template < class Tp1, class Tp2, class Tp3, class Tp4, class Tp5 >
LPVOID call( Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3, Tp4 lpParam4, Tp5 lpParam5 )
{
if( !Assigned() )return NULL;
return ThisCall5( m_lpFunc, m_lpThis, lpParam1, lpParam2, lpParam3, lpParam4, lpParam5 );
}
template < class TTHIS >
LPVOID callWithThis(TTHIS * pThis)
{
if( !Assigned() )return NULL;
return ThisCall0( m_lpFunc, pThis );
}
template < class TTHIS, class Tp1 >
LPVOID callWithThis( TTHIS * pThis, Tp1 lpParam1 )
{
if( !Assigned() )return NULL;
return ThisCall1( m_lpFunc, pThis, lpParam1 );
}
template < class TTHIS, class Tp1, class Tp2 >
LPVOID callWithThis( TTHIS * pThis, Tp1 lpParam1, Tp2 lpParam2 )
{
if( !Assigned() )return NULL;
return ThisCall2( m_lpFunc, pThis, lpParam1, lpParam2 );
}
template < class TTHIS, class Tp1, class Tp2, class Tp3 >
LPVOID callWithThis( TTHIS * pThis, Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3 )
{
if( !Assigned() )return NULL;
return ThisCall3( m_lpFunc, pThis, lpParam1, lpParam2, lpParam3 );
}
template < class TTHIS, class Tp1, class Tp2, class Tp3, class Tp4 >
LPVOID callWithThis( TTHIS * pThis, Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3, Tp4 lpParam4 )
{
if( !Assigned() )return NULL;
return ThisCall4( m_lpFunc, pThis, lpParam1, lpParam2, lpParam3, lpParam4 );
}
template < class TTHIS, class Tp1, class Tp2, class Tp3, class Tp4, class Tp5 >
LPVOID callWithThis( TTHIS * pThis, Tp1 lpParam1, Tp2 lpParam2, Tp3 lpParam3, Tp4 lpParam4, Tp5 lpParam5 )
{
if( !Assigned() )return NULL;
return ThisCall5( m_lpFunc, pThis, lpParam1, lpParam2, lpParam3, lpParam4, lpParam5 );
}
xEvent & operator =( xEvent & thiscall )
{
this->m_lpFunc = thiscall.m_lpFunc;
this->m_lpThis = thiscall.m_lpThis;
return *this;
}
BOOL Assigned(){ return (m_lpFunc != NULL);}
protected:
LPVOID m_lpThis;
LPVOID m_lpFunc;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -