gpt4 book ai didi

delphi - 无法修改EnumWindows回调中的参数

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

我尝试使用Lazarus(Free Pascal)中的以下代码来获取主窗口句柄:



function FindMainWindow(Pid: LongWord): LongWord;
type
TParam = record
Window: HWnd;
Test: Integer;
Pid: LongWord;
end;
PParam = ^TParam;
var
Params: TParam;
function _FindMainWindow(Wnd: HWnd; MyLParam: PParam): Bool; stdcall;
var
WinPid: DWord;
begin
with MyLParam^ do
begin
Test := 2;
GetWindowThreadProcessID(Wnd, @WinPid);
Result := (WinPid <> Pid) or (not IsWindowVisible(Wnd))
or (not IsWindowEnabled(Wnd));
if not Result then begin
Window := Wnd;
end;
end;
end;
begin
Params.Pid := Pid;
Params.Test := 1;
EnumWindows(@_FindMainWindow, LParam(@Params));
ShowMessage('Done!');
ShowMessage(IntToStr(Params.Test));
Result := Params.Window;
end;


问题是在运行回调后 Params.Test仍为1。我想在 Params函数中修改 _FindMainWindow

注意:由于出现“访问冲突”错误,因此无法直接访问 Params中的 _FindMainWindow

最佳答案

当然在Delphi中,而且看起来也像FPC,嵌套函数对于用作回调函数无效。当使用32位编译器时,嵌套函数可以用作回调。但是,此类代码仅由编译器接受,因为回调函数在Windows单元中被声明为无类型的指针。如果Windows单元将它们声明为过程类型,则会发现编译器对象反对使用嵌套函数。

对于64位Delphi编译器,您根本无法将嵌套函数用作回调。尽管编译器允许您继续进行操作,但是由于Windows单元中使用了无类型的指针(请参见上文),所以回调函数未正确调用。显然,这对于FPC也是正确的。您将必须停止使用嵌套函数进行回调。

有趣的是,FPC和Delphi编译器在此处具有相同的特征。我的猜测是,基于x64的调用约定是基于寄存器的约定,而不是基于堆栈的x86 stdcall是导致此问题的原动力。我敢打赌,如果您尝试使用嵌套的x86 register函数作为回调,那么在运行时也会失败。

关于delphi - 无法修改EnumWindows回调中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11154727/

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