每当我不得不使用 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 中修复了吗?