我想将类的方法作为回调传递给WinAPI函数.这是可能的,如果可以,怎么样?
设置计时器的示例:
TMyClass = class
public
procedure TimerProc(Wnd:HWND; uMsg:DWORD; idEvent:PDWORD; dwTime:DWORD);
procedure DoIt;
end;
[...]
procedure TMyClass.DoIt;
begin
SetTimer(0, 0, 8, @TimerProc); // <-???- that's what I want to do (last param)
end;
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
编辑:目标是将此类的方法指定为回调.课外没有程序.
编辑2:我感谢你的帮助,但只要该方法没有"TMyClass".在它的名字前面它不是我正在寻找的.我曾经这样做,但想知道是否可以完全保持在面向对象的世界.指针魔术欢迎.
Madshi有一个MethodToProcedure程序.它位于"maDasic"包中的"madTools.pas"中.如果你使用它,你应该将"TimerProc"的调用约定更改为stdcall,DoIt过程将变为,
TMyClass = class
private
Timer: UINT;
SetTimerProc: Pointer;
[...]
procedure TMyClass.DoIt;
begin
SetTimerProc := MethodToProcedure(Self, @TMyClass.TimerProc);
Timer := SetTimer(0, 0, 8, SetTimerProc);
end;
// After "KillTimer(0, Timer)" is called call:
// VirtualFree(SetTimerProc, 0, MEM_RELEASE);
Run Code Online (Sandbox Code Playgroud)
我从来没有尝试,但我认为还可以尝试复制"classses.MakeObjectInstance"中的代码,以传递除TWndMethod之外的其他过程类型.
小智 5
您正在使用哪个版本的Delphi?
在最近的方法中,您可以为此使用静态类方法:
TMyClass = class
public
class procedure TimerProc(Wnd:HWND; uMsg:DWORD; idEvent:PDWORD; dwTime:DWORD); stdcall; static;
procedure DoIt;
end;
[...]
procedure TMyClass.DoIt;
begin
SetTimer(0, 0, 8, @TimerProc);
end;
Run Code Online (Sandbox Code Playgroud)