procedure TForm1.FormCreate(Sender: TObject);
asm//以下两句都不行!
call TWinControl.Handle
call TWinControl.GetHandle
end;我只是想获得窗体的句柄而已!用basm肿么弄!
asm//以下两句都不行!
call TWinControl.Handle
call TWinControl.GetHandle
end;我只是想获得窗体的句柄而已!用basm肿么弄!
http://zhidao.baidu.com/question/321081854.htmlasm
mov edx, str
call MyShowMessage
end;
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,就自然得研究一下偏移量了.
其他版本没作研究.
还可以这样
procedure Get_TWinControlHandle_Address;
begin
TWinControl(NIL).Handle;
end;然后分析 函数@Get_TWinControlHandle_Address中的第一个CALL,即可得到GetHandle函数的地址
得到地址后,就可以构造类方法来任意调用了,这里得用到反编译或者,根据情况直接访问@Get_TWinControlHandle_Address的地址字节来获取,后着需要根据情况来分析.
const
PPTWinControlCreate: Pointer = @TWinControl.Create;然后通过这个地址加个固定的偏移量就是TWinControl.GetHandle的地址了!
忘记说了,我最常用的是D7
function GetTheHandle(Sender: TObject): HWND;
begin
Result := TWinControl(Sender).Handle
end;
以后basm就直接call 它就行了我的本意就是不想再单写函数,定义常量的话是能“忍”的,呵呵
我当时是为了能解释执行 Object.Handle这样的文本代码,需要把所有入口地址保存到列表中,你这个研究,具体看用途了.个人观点.:)