EnumWindow上的Windows 7 x64错误?

Moj*_*jik 1 delphi

在这里看到简单的Delphi代码:

function EnumProc(Handle: THandle; Lparam: LPARAM): Bool; stdcall;
begin
  TMemo(Lparam).Lines.Add(IntToStr(Handle));
end;
Run Code Online (Sandbox Code Playgroud)

叫它 :

procedure TForm1.FormCreate(Sender: TObject);
begin
  EnumWindows(@EnumProc, Lparam(Memo1))
end;
Run Code Online (Sandbox Code Playgroud)

此代码在Windows XP,Window 7 x86和Windows 8中成功运行.

现在测试Windows 7 x64中的代码,它只返回一个项目,这意味着Windows只调用一次EnumProc,这意味着EnumProc的结果为false,没有更多的窗口可用于枚举...

现在将我们的EnumProc更改为:

function EnumProc(Handle: THandle; Lparam: LPARAM): Bool; stdcall;
begin
  TMemo(Lparam).Lines.Add(IntToStr(Handle));
  result:= True;
end;
Run Code Online (Sandbox Code Playgroud)

好的,这个怎么样?!它适用于任何版本的Windows,包括Windows 7 x64!

任何的想法 ?它是Windows中的错误还是我的代码中的错误?

关心Mojtaba.

Rog*_*and 6

这是你的代码的问题.在第一个示例中,您定义了一个返回a的函数,但Bool您无法返回任何内容.你很幸运它可以工作.我很惊讶它在没有警告你的情况下进行编译.

正如文档所说

如果函数退出而没有为Result或函数名赋值,则函数的返回值是未定义的.

你的第二个(正确的)例子没有这个问题因此它工作正常,这并不奇怪.