EnumWindow上的Windows 7 x64错误?

时间:2013-08-17 09:14:56

标签: delphi

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

function EnumProc(Handle: THandle; Lparam: LPARAM): Bool; stdcall;
begin
  TMemo(Lparam).Lines.Add(IntToStr(Handle));
end;

称之为:

procedure TForm1.FormCreate(Sender: TObject);
begin
  EnumWindows(@EnumProc, Lparam(Memo1))
end;

此代码在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;

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

有什么想法吗?它是Windows中的错误还是代码中的错误?

关心Mojtaba。

1 个答案:

答案 0 :(得分:6)

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

作为documentation says

  

如果函数退出而未将值赋给结果或函数名称,则函数的返回值未定义。

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