void A()
{
//省略
}
void B()
{
//省略
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
   DWORD dwSize = (DWORD)B - (DWORD)A;
}
我用调试程序观察
函数B的地址 = 0x00411f30 ;
函数A的地址 = 0x00411e40 ;
dwSize应该等于240(F0)才对,可为什么却等于4294965846(FFFFFA56),应该没有溢出啊,
为什么会是这个结果呢?

解决方案 »

  1.   

    B=atoi(B);
    A=atoi(A);
    dwszie=B-A;
      

  2.   

    B和A不都是一个地址吗?为什么要使用atoi;
      

  3.   

    lz,是很奇怪啊,就算我先用  DWORD As = (DWORD)A;
    DWORD Bs = (DWORD)B; 竟然As和Bs的值就不是A和B的地址LJC,你那个atoi无话好说了
      

  4.   

    我是试过了用atoi出来的结果就是你要的结果啊!!
      

  5.   

    我知道A和B 不是同一个地址,我只想知道为什么要用atoi,而且我用了dwSize等于0 .
    晕!!
      

  6.   

    B=atoi(B);
    A=atoi(A);
    B和A都是函数地址,又不是变量,能赋值吗??
    它们的值改变了能行么,后面我还要使用这两个函数呢!
      

  7.   

    跟atoi没关系.
    LZ同时输出
    DWORD dwSizeBA = (DWORD)B - (DWORD)A;
    DWORD dwSizeAB = (DWORD)A - (DWORD)B;
    试试
      

  8.   

    你可以声明啊
    B=atoi(BB);
    A=atoi(AA);
    dwszie=BB-AA;
    dwszie的地址就是了
      

  9.   

    和大家共同研究
    我注意到这样一个现象,如果在代码中把A和B函数的位置互换,那么B和A的地址会互换,可以猜测,A和B指的是两个函数在代码段中的地址;如果在A和B函数互换位置的时候,
    DWORD As = (DWORD)A;和DWORD Bs = (DWORD)B的位置不变动,那么As和Bs的值跟原来没有区别,我想这也许跟执行有关
    进一步的讨论,我再试试
      

  10.   

    同意A和B就是在程序中的代码段中的地址。
    可LJC2000a的atoi我实在不明白,
    B=atoi(B); 参数B难到不用类型转换吗?
    atoi的原型:
    int WINAPI atoi( const TCHAR *sz);
    B是应该是个PROC类型。
    晕ing!!!
      

  11.   

    又进行了一些互换的尝试,有一些思考
    不管DWORD As = (DWORD)A;和DWORD Bs = (DWORD)B的位置再做什么变动,值都不会改变,我想可能系统执行的步骤会是这样的:如上解释,A和B两个函数的地址应该是它们在代码段的地址;在执行时,函数的地址会重新定向,其实在我的机器上,As和A并没有太大的差距,差距在128之内,也就是说,编译器重定向的原则本着不跟原来的函数地址有较大的差距,(在MSIL语言中,如果函数的跳转在128单位之内的话,指令只占一个字节);我觉得我可以理解了,也许没有说清楚
    如果要使用函数的地址的话,还是使用&吧,大家都懂,也比较标准
    祝好
      

  12.   

    如果用&B或&A实际得到的应该是装载函数首地址的的地址,这有用么。我的实际目的是想得到函数A的大小。
    我的程序现在直接使用dwSize = 240;来代替DWORD dwSize = (DWORD)B - (DWORD)A;
    难到真没有其他办法了吗?
      

  13.   

    static void A()
    {
    //省略
    }
    static void B()
    {
    //省略
    }
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
       DWORD dwSize;
       dwSize = (BYTE*)B - (BYTE*)A;
       return 0;
    }
      

  14.   

    louifox(兰陵笑笑生)
    ----------------------
    同意此楼的,把函数声明为static,很多代码注入都是这样做的.
      

  15.   

    如果使用static,那dwSize = (DWORD)B - (DWORD)A也可以。
    使用此法虽然可行,但dwSize将变成400,有没有更好的办法呢?
      

  16.   

    A和B的值并不是函数代码开始的地址, &A和&B也是一样,
    他们获得都是代码段中一个跳转表中的表项的地址, 比如你有两个函数A和B,在跳转表里面有两个选项:
    jmp Addr1;
    ...
    jmp Addr2;
    而Addr1 和Addr2是在程序被载入的时候填入的, 而这两个地址才指向真正代码存放的地址.
    所以你用A-B的值只是等于两个表项的差距和两个表项出现的顺序, 和函数大小无关.
    使用static的时候这个表就不见了
    所以楼主用这种方法算函数大小其实不可行.