gpt4 book ai didi

delphi - 如何将方法作为回调传递给 Windows API 调用?

转载 作者:行者123 更新时间:2023-12-03 14:46:01 25 4
gpt4 key购买 nike

我想将类的方法作为回调传递给 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;

感谢您的帮助!

编辑:目标是将此类的方法指定为回调。类外没有任何程序。

Edit2:我感谢您的所有帮助,但只要该方法没有“TMyClass”。在它的名字前面,它不是我正在寻找的。我曾经这样做过,但想知道是否可以完全留在面向对象的世界中。欢迎使用指针魔法。

最佳答案

Madshi有一个MethodToProcedure程序。它位于“madBasic”包中的“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);


我从未尝试过,但我认为也可以尝试复制“classses.MakeObjectInstance”中的代码,以传递除 TWndMethod 之外的其他过程类型。

关于delphi - 如何将方法作为回调传递给 Windows API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2787887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com