游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2275|回复: 5

开源:小东西(1)

[复制链接]

25

主题

304

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
发表于 2006-11-4 00:17:00 | 显示全部楼层 |阅读模式
#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
};

25

主题

304

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
 楼主| 发表于 2006-11-4 00:19:00 | 显示全部楼层

Re:开源:小东西(1)

用法:
用来包装类成员函数

xThisCall call( &obj, &CObj::Func );

call.call( param... );

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-6 10:20:00 | 显示全部楼层

Re:开源:小东西(1)

谢谢LZ共享,这应试算是对我之前的某贴的一个总结实现版。
PS,感觉LZ绕过语言层直接编写compiler的object code,个人不太赞成。

在上乌鸢吃,在下蝼蚁食,夺彼而与此,不太偏心了吗?

25

主题

304

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
 楼主| 发表于 2006-11-6 19:46:00 | 显示全部楼层

Re:开源:小东西(1)

这是我一个库里的一个小东西
比较方便

0

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2007-5-1 21:33:00 | 显示全部楼层

Re:开源:小东西(1)

C++的爸爸都60多了吧...

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-5-4 13:45:00 | 显示全部楼层

Re:开源:小东西(1)

这种地方用ASM。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 14:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表