flyman

opengl world
随笔 - 10, 文章 - 0, 评论 - 65, 引用 - 0
数据加载中……

超脱c++权限控制,首先申明这没有任何用处





VC2005通过编译,由于虚函数表的问题,依赖性很大。
其实这没有任何用处,只是在使用多了一个选择而已。
带参数的虚函数注意第一个参数为对象指针,静态的不用关心太多。

至于private 和protected非虚函数和非静态的,不知道怎么取他们的地址,所以没有写。


直接操作成员变量的
如果有多个成员变量
注意变量的对齐问题,
我不再举例:
有点复杂
^_^

#include 
"stdafx.h"
#include 
<string>
#include 
<algorithm>
#include 
<iostream>
typedef 
void (_cdecl *funcall)(int );
typedef 
void (_cdecl *funcall1)(void* ,int );
typedef 
void (_cdecl *funcall2)(void* );
funcall g_call;
funcall2 g_call1;
void funcallinstance()
{
    g_call(
3);
}
class aa
{
public:
    aa()
    {
        
//callfunc(aat);
        g_call=aat;
        
//g_call1=(funcall2)&aa::fun1;
    }

private :
    
static void _cdecl  aat(int a)
    {
        
int b=a;
        std::cout
<<"aa";
    }
    
virtual void _cdecl fun(int a)
    {
        
int b=a;
        fuckmember
=b;
        std::cout
<<"virtual";
    }
    
void _cdecl fun1()
    {
        std::cout
<<"common";
    }
    
int fuckmember;
    };
int main()
{
    aa attt;
    
int* pthis=(int*)&attt;
    
int* funtable=(int*)pthis[0];
    
int & member=pthis[1];
    member
=10;
    funcall1 virfun
=(funcall1)funtable[0];
    virfun(
&attt,5);
    funcallinstance();
    
///g_call1(&attt);
    
}

posted on 2007-09-22 14:19 flyman 阅读(1437) 评论(12)  编辑 收藏 引用

评论

# re: 超脱c++权限控制,首先申明这没有任何用处  回复  更多评论   

Crack的时候可能有用 正常开发确实没什么用处!~
2007-09-22 23:11 | shaker(太子)

# re: 超脱c++权限控制,首先申明这没有任何用处  回复  更多评论   

#define private public
#define protected public
2007-09-23 07:28 | szhoftuncun

# re: 超脱c++权限控制,首先申明这没有任何用处[未登录]  回复  更多评论   

To:flyman
你这个可是大错特错,虽然现在编译没有问题,你可以试试在
virtual void _cdecl fun()
{
std::cout<<"virtual";
}
这个虚函数里调用成员变量试试,肯定出错。为什么呢,因为对象方法在调用的时候需要传入this指针,而你这种做法把它转换成了静态方法。肯定是不可行的。而且你这种强制转化很容易出错,错误原因就是我上面说的。

你可以看一下这篇文章,将的是C++成员函数调用的方法。
http://www.cnblogs.com/Aplo/archive/2007/09/07/886145.html
2007-09-23 08:57 | aplo

# re: 超脱c++权限控制,首先申明这没有任何用处  回复  更多评论   

我已经在下面声明,虚的如果有参数要传如对象指针了,
我添加了传入参数的代码。
2007-09-23 09:07 | flyman

# re: 超脱c++权限控制,首先申明这没有任何用处  回复  更多评论   

不错的东西, 不过用到的地方不多啊. 除了要实现更强的delegate外, 其它用处确实不大. 我记得某人说过, 其它程序员专注于应用和更加强大的库的时候, C++程序员还在着迷于开发模型和内部原理. 太在乎内部结构似乎真的是我们做C++的通病.
2007-09-23 09:39 | danielwyo

# re: 超脱c++权限控制,首先申明这没有任何用处[未登录]  回复  更多评论   

@danielwyo
呵呵,没有办法,现在正在用NEWTON physics engine,
与C++的结合上要用的这些东西,顺便拿来给大家共享一下,
现在想想还是用BOOST比较好。

“其它程序员专注于应用和更加强大的库的时候, C++程序员还在着迷于开发模型和内部原理. 太在乎内部结构似乎真的是我们做C++的通病”

很在理!
2007-09-23 09:45 | flyman

# re: 超脱c++权限控制,首先申明这没有任何用处[未登录]  回复  更多评论   

我晕,这和虚函数没有关系,成员函数调用大多数情况都需要传入this指针,但是绝对不是想你那样传,一般来说this指针会在函数调用之前传给ECX寄存器,而不是作为参数传入,虚函数可能会将this指针压入栈(这种做法等同于传参),这两种处理方法是不一样的。博主可以用C++自带的操作符
->* 或 .*
实现成员函数的调用。
2007-09-24 10:11 | aplo

# re: 超脱c++权限控制,首先申明这没有任何用处  回复  更多评论   

@aplo
"我晕",我认为你很清醒^_^。
我不知道我是否懂的你全部的意思,所以有些可能有些偏差。
我不知道你说的“THIS 指针在调用前都传入ECX寄存器--书上都这么说。”是否覆盖了所有的函数,据我调试并不都是这样,其中私有的虚函数就不是这样,在CALL 私有虚函数指针时,ECX中的恰巧是虚函数的指针(我的VS2005是特别版??|))),THIS指针在虚函数的压占问题,你自己可以实验,我不至可否。o(∩_∩)o...。
从调试上看,传入对象指针确实能保证THIS指针的正确性(private virtual),
我不想探究编译器的为什么问题,毕竟我没有在CPPBLOG或CSDN上写过编译器“深入浅出”的文章^_^。

C++自带操作符?我怀疑他们直接操作PRIVATE成员的能力,也许你有其他的方法,严重关注。
当然类内部操作我无话可说。

不用怀疑静态的方法,压根他和对象指针就没有关系,我不保证这适合所有的情况,所以也不建议使用这种写法。

“成员函数调用大多数情况都需要传入this指针”,我不知你是有所保留还是保留的非常多,我们需要例子,并不是含糊其词的说明。who no,who yes.
2007-09-24 13:04 | flyman

# re: 超脱c++权限控制,首先申明这没有任何用处[未登录]  回复  更多评论   

静态方法我从没有怀疑啊,
此外,公共,私有,保护和这里讨论的内容没有关系,是否是虚函数和普通成员函数可能会有关系(我没有具体调试过,但是碰到过虚函数的this是通过压栈传入函数的,而普通成员函数确是通过ECX传入函数的你自己可以调试看),
你这种做法总体来说是比较危险的,所以还是尽量使用C++自带操作符,也可以参照boost中的function。
2007-09-24 13:12 | aplo

# re: 超脱c++权限控制,首先申明这没有任何用处[未登录]  回复  更多评论   

另外关于“成员函数调用大多数情况都需要传入this指针”,我只是分析你的代码得出的结论,因为我没有测试过不敢妄下结论,因为你调用
virtual void _cdecl fun()
{
std::cout<<"virtual";
}
时并没有传入this,如果你测试过并且编译运行没有错的话,就可以得出一个结论,那就是在成员函数内没有使用成员数据的编译器可能不会传入this指针。这样这个函数就和普通的静态函数没有区别,可以随处调用而不会引起栈的问题。但是如果需要传入this(可能是通过ECX或是Push this,确实会有这两种情况)就会引起非法内存访问或是栈地址不对的问题。
2007-09-24 13:19 | aplo

# re: 超脱c++权限控制,首先申明这没有任何用处  回复  更多评论   

我也没有怎么调试,另外我确实不打算用这个编码格式,所以正在看BOOST的FUNCTION和BIND用发,这可能会符合某种比较无奈的折中,像知道头文件,而要调用的函数又不让正常调用的情况下来用,根据我测试的情况,正常的函数还是没有找到正确的方法,静态和虚函数由于指针比较好得,所以写的这两种,其实这并不是什么新鲜的东西。
2007-09-24 13:27 | flyman

# re: 超脱c++权限控制,首先申明这没有任何用处[未登录]  回复  更多评论   

你可以看看我写的这篇文章
http://www.cnblogs.com/Aplo/archive/2007/09/07/886145.html
这个实现了普通成员函数和虚函数的调用方法,你可以看源码的实现过程。根据你的需求去修改。
我实现的就是类似于C#的delegate。个人感觉封装的还不错。哈哈,欢迎拍砖。

2007-09-24 13:50 | aplo

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理