1

在此处查看简单的 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 。

4

1 回答 1

6

你的代码有问题。在您的第一个示例中,您定义了一个返回 a 的函数,但Bool您没有返回任何内容。你很幸运,它完全有效。我很惊讶它在没有警告你的情况下编译。

正如文件所说

如果函数在没有为Result或函数名赋值的情况下退出,那么函数的返回值是未定义的。

您的第二个(正确)示例没有此问题,因此可以正常工作,这不足为奇。

于 2013-08-17T09:21:58.967 回答