在这里查看简单的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。
答案 0 :(得分:6)
这是您的代码的问题。在第一个示例中,您定义了一个返回Bool
的函数,但您无法返回任何内容。你很幸运它可以工作。我很惊讶它在没有警告你的情况下编译。
如果函数退出而未将值赋给结果或函数名称,则函数的返回值未定义。
你的第二个(正确的)例子没有这个问题因此它工作正常,这并不奇怪。