procedure TForm1.FormCreate(Sender: TObject);
asm//以下两句都不行!
  call TWinControl.Handle
  call TWinControl.GetHandle
end;我只是想获得窗体的句柄而已!用basm肿么弄!

解决方案 »

  1.   

    再引申一下,用basm怎么操作属性,怎么调用非本单元的类的私有方法!
      

  2.   

    是不是不能直接Call??楼主参考这个
    http://zhidao.baidu.com/question/321081854.htmlasm
        mov edx, str
        call MyShowMessage
      end;
      

  3.   

    http://blog.csdn.net/jian704/article/details/1767628看看这个
      

  4.   

    Delphi7下,procedure TForm1.Button1Click(Sender: TObject);
    var
      H , H1 : THandle;
    begin
      H := Self.Handle;
      H1 := 0;
      asm
        MOV  EAX , Self;
        MOV  EAX , [EAX + $180]
        MOV  H1  , EAX;
      end;
      if H<>H1 then
        Caption := '失败';
    end;D2010中,$180则要改成$258
    至于$180,$258怎么来的,既然研究BASM,就自然得研究一下偏移量了.
    其他版本没作研究.
      

  5.   

    如果只是想调用非Pushished属性的Get方法,如GetHandle
    还可以这样
    procedure Get_TWinControlHandle_Address;
    begin
      TWinControl(NIL).Handle;
    end;然后分析 函数@Get_TWinControlHandle_Address中的第一个CALL,即可得到GetHandle函数的地址
    得到地址后,就可以构造类方法来任意调用了,这里得用到反编译或者,根据情况直接访问@Get_TWinControlHandle_Address的地址字节来获取,后着需要根据情况来分析.
      

  6.   

    确实想知道函数地址,参考第个回复.我是通过这个方法来获取私有函数地址的,用的是hde32分解汇编子句,也可以用Dede的反编译代码部分(已经开源),不过得修改一下,这个反汇编有错误.特殊字句翻译上出现大问题,导致后面的反汇编全部不正确.
      

  7.   

    给你解释一下为什么.首先你调用函数A的时候,由于函数B根本没被调用,因此,函数B压根就没编译到Exe中,而你改成调用B时,A又没有被编译进来,不过地址是同一个地址属于巧合,如果在编译函数前,有编译代码长度发生改变,那么函数地址会跟着改变.
      

  8.   

    原来如此,我在CPU Window看汇编代码的时候就发现那个类所在单元的代码行的编号从几十直接跳到900多,我还以为在其他地方还有那个类的代码呢,原来根本就没编译进去!
      

  9.   

    要把NIL改成非0常数才能通过编译!另外我有个方法,就是先获得TWinControl.Create的地址:
    const
      PPTWinControlCreate: Pointer = @TWinControl.Create;然后通过这个地址加个固定的偏移量就是TWinControl.GetHandle的地址了!
      

  10.   

    Create+偏移,自然能得到地址,有区别的就是,如果这个类的某些函数没被编译进来,那这个地址就得跟着变动,有一定不可靠因素,甚至连这个函数都没有被编译进来, 这和fHandle地址不一样,对象本身的成员,只要一定义,并且别任意地方引用,不管这个地方是否被编译进来,就回跟随Create一起申请内存,而函数地址就有不好说了。NIL通过是D7
    忘记说了,我最常用的是D7
      

  11.   

    如果非得再写个函数的话,那我不如直接这样了:
    function GetTheHandle(Sender: TObject): HWND;
    begin
      Result := TWinControl(Sender).Handle
    end;
    以后basm就直接call 它就行了我的本意就是不想再单写函数,定义常量的话是能“忍”的,呵呵
      

  12.   

    我的用途和你不一样
    我当时是为了能解释执行 Object.Handle这样的文本代码,需要把所有入口地址保存到列表中,你这个研究,具体看用途了.个人观点.:)