|
|
#pragma once
namespace xlibplus
{
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 xThisCall
{
public:
xThisCall()
{
m_lpThis = NULL;
m_lpFunc = NULL;
}
template <class T>
xThisCall(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 );
}
xThisCall & operator =( const xThisCall & 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;
};
typedef xThisCall xEventCall;
//#define XTHISCALL __stdcall
};
|
|