delphi - 常规过程/方法指针

标签 delphi winapi

如何将timeSetEvent的回调函数定义为实例方法?

TUDPBC = class(TObject)                                         
private
  hTimer: word;
...
public
  procedure sendUDPBC;
...
end;

procedure DoTimer(uTimerID, uMessage: UINT; dwUser,dw1,dw2: DWORD); stdcall;

procedure TUDPBC.sendUDPBC;  //send UDP Broadcast
begin
...
  hTimer := TimeSetEvent(FTimeOut, uRes, DoTimer, 0, TIME_ONESHOT); //need DoTimer as a TUDPBC class method
...
end;

最佳答案

How can I define callback function of timeSetEvent as an instance method?

简单的答案是你不能。您无法更改回调的签名。它由 API 定义,并且必须是 simple unbound procedure with this signature :

typedef void ( CALLBACK *LPTIMECALLBACK)(
   UINT      uTimerID,
   UINT      uMsg,
   DWORD_PTR dwUser,
   DWORD_PTR dw1,
   DWORD_PTR dw2
);

您可以做的是将一个指针传递给包含实例地址的timeSetEvent。该模式运行如下:

procedure TimeProcCallback(uTimerID, uMessage: UINT; dwUser,dw1,dw2: DWORD_PTR); stdcall;
begin
  TUDPBC(dwUser).TimeProc(uTimerID, uMessage);
end;

这是您传递给timeSetEvent 的回调。你的类看起来像这样:

type
  TUDPBC = class
  private
    FTimerID: MMRESULT;
    procedure TimeProc(uTimerID, uMessage: UINT);
  end;

该类的此方法将由回调函数调用,因此可以访问实例变量。

像这样设置计时器:

FTimerID := timeSetEvent(TimeOut, uRes, TimeProcCallback, DWORD_PTR(Self), TIME_ONESHOT);

因此,您在 dwUser 参数中传递实例的地址。然后将其传递给您的回调。该回调可以依次调用实例方法。

关于delphi - 常规过程/方法指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34220201/

相关文章:

c++ - 将 'this' 指针作为 LPARAM 传递

linux - linux 中 Win32 API 的等价物是什么?

delphi - 如何检查单行是否为空值

delphi - 如何在firemonkey TStringGrid中完成编辑后立即将数据发布到数据库

Java CXF Web 服务和 Delphi 2010

delphi - 在 Delphi 中如何让 PChar 越过十六进制 00 到达文件末尾?

c - 如何在 Windows 中退出阻塞的 connect() 调用?

c - LCC-- 如何阻止调试器在应用程序启动时中断?

c++ - 使用 SecureZeroMemory() 真的有助于提高应用程序的安全性吗?

delphi - 为什么当我尝试裁剪位图时出现空白 TImage?