Delphi里怎么把类成员方法转为windows回调函数

问答知识库用户 |浏览204次
收藏|2014/05/17 22:00
如题,Delphi里把类成员方法转为windows回调函数需要怎么处理啊?
听说是用MakeObjectInstance,具体如何做呢?

满意回答

2014/05/17 22:00

unit ClassCallback;

interface

type
  TCallbackInstance = array [1..18] of Byte;
  PInteger=^Integer;
  procedure MakeCallbackInstance(var Instance: TCallbackInstance;
  ObjectAddr: Pointer; FunctionAddr: Pointer);
    
implementation

  {----------------------------}   
  { CallbackCode DASM }
  {----------------------------}
  { MOV EAX, [ESP]; }
  { PUSH EAX; } //<========呵呵,这就是壳的汇编码哦
  { MOV EAX, ObjectAddr; }
  { MOV [ESP+4], EAX; }
  { JMP FunctionAddr; }
  {----------------------------}
  procedure MakeCallbackInstance(var Instance: TCallbackInstance;
  ObjectAddr: Pointer; FunctionAddr: Pointer);
  const CallbackCode: TCallbackInstance =
  ($8B,$04,$24,$50,$B8,$00,$00,$00,$00,$89,$44,$24,$04,$E9,$00,$00,$00,$00);
  begin
  Move(CallbackCode, Instance, SizeOf(TCallbackInstance));
  PInteger(@Instance[6])^ := Integer(ObjectAddr);
  PInteger(@Instance[15])^ := Integer(Integer(FunctionAddr) - Integer(@Instance) - 18);
  end;
end.

调用过程:
MakeCallbackInstance(FCallbackInstance, Self, @TTest.MsgProc);
OldWndProc := Pointer(GetWindowLong(AWindow.Handle, GWL_WNDPROC));
SetWindowLong(AWindow.Handle, GWL_WNDPROC, Longint(@FCallbackInstance));

在WIndows 2003下需要将程序添加到数据执行保护里面去,否则运行报错


关于MakeObjectInstance
参考:http://blog.csdn.net/linzhengqun/article/details/1451088

热心网友

其他回答(0)
0人关注该问题
待解决问题



+1
 加载中...