我有一个简单的线程,在执行过程中我尝试使用线程中定义的函数之一的地址调用 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
一个普通的旧函数,即未绑定到实例的函数。您必须单独传递实例。像这样:
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
不满足这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)