gpt4 book ai didi

multithreading - 如何将线程函数的地址作为回调传递给winapi?

转载 作者:行者123 更新时间:2023-12-03 19:11:13 25 4
gpt4 key购买 nike

我有一个简单的线程,在执行过程中,我尝试使用线程中定义的函数之一的地址调用 EnumWindows()。
所以我正在尝试这样做: EnumWindows(@cbEnumWindowsClickOK, 0);其中 cbEnumWindowsClickOK 是在线程类中定义的 EnumWindowProc,如下所示:

TAutoClickOKThread = class(TThread)
private
fExitEvent : THandle;
function cbEnumWindowsClickOK(Wnd: HWND; Info: Pointer): BOOL;
public
constructor Create(ExitEvent : Thandle);
procedure Execute(); override;
end;

当我尝试这个时,我不断收到“错误:需要变量”,暗示它不会将 @cbEnumWindowsClickOK 解释为地址。如果我将函数移动到全局范围(从线程中删除它)它确实有效。

关于如何解决这个问题的任何想法?

最佳答案

你必须通过EnumWindows一个普通的旧函数,即未绑定(bind)到实例的函数。您必须单独传递实例。像这样:

function EnumFunc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
Result := TAutoClickOKThread(lParam).cbEnumWindowsClickOK(hwnd);
//note that there is now no need for the Info parameter
end;
...
procedure TAutoClickOKThread.Execute;
begin
...
EnumWindows(EnumFunc, LPARAM(Self));
...
end;

必须这样做的原因是实例方法与 EnumWindows 所需的签名不匹配。 .实例方法有一个包含实例引用的额外隐式参数,即 Self .这就是您能够引用实例成员的方式。但是 EnumFunc 的签名不满足于此。

关于multithreading - 如何将线程函数的地址作为回调传递给winapi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706637/

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