2

每当我不得不使用 API 回调时,比如 with EnumChildWindows,我通常是这样写的:

procedure TMyClass.FindChildWindowAndDoSomething(
        AParent: HWND; 
        ASomeCriterion: Integer; 
  const AData: Pointer);
type
  TEnumWndParam = record
    Criterion: Integer;
    Data: Pointer;
  end;
  PEnumWndParam  = ^TEnumWndParam;

  function EnumProc(AHandle: HWND; AParam: PEnumWndParam): Boolean; stdcall;
  begin
    Result := not {AHandle satisfies AParam^.Criterion};
    if not Result then
      {Do something to AHandle, possibly using AParam^.Data}
    else
      Result := True;
  end;

var
  lParam: TEnumWndParam;
begin
  lParam.Criterion := ASomeCriterion;
  lParam.Data := AData;
  EnumChildWindows(AParent, @EnumProc, Winapi.Windows.LPARAM(@lParam));
end;

这在 32 位 Delphi XE3 上仍然可以正常工作,但对于 64 位编译器,情况有些不同:它仍然可以毫无问题地编译,但是当EnumProc被调用时,它得到的参数包含垃圾。我发现完成这项工作的唯一方法是将本地声明(参数记录和枚举函数)移动到全局空间中。

我真的不喜欢这种做法,因为它不必要地扩大了这些声明的范围并使命名空间变得混乱。有没有其他方法可以让它与 64 位编译器一起工作?这可能已经在 XE4 中修复了吗?

4

0 回答 0