如。自关闭相关问题以来-下面添加了更多示例。
下面的简单代码(可找到顶级Ie窗口并枚举其子窗口)可以在“ 32位Windows”目标平台上正常运行。早期版本的Delphi也没有问题:
procedure TForm1.Button1Click(Sender: TObject);
function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
Server = 'Internet Explorer_Server';
var
ClassName: array[0..24] of Char;
begin
Assert(IsWindow(hwnd)); // <- Assertion fails with 64-bit
GetClassName(hwnd, ClassName, Length(ClassName));
Result := ClassName <> Server;
if not Result then
PUINT_PTR(lParam)^ := hwnd;
end;
var
Wnd, WndChild: HWND;
begin
Wnd := FindWindow('IEFrame', nil); // top level IE
if Wnd <> 0 then begin
WndChild := 0;
EnumChildWindows(Wnd, @EnumChildren, UINT_PTR(@WndChild));
if WndChild <> 0 then
..
end;
我插入了,Assert以指示在使用“ 64位Windows”目标平台时失败的地方。如果我没有嵌套回调,则代码没有问题。
我不确定参数传递的错误值只是垃圾,还是由于某些错误的内存地址(调用约定?)引起的。嵌套回调实际上是我一开始不应该做的事情吗?还是这仅仅是我必须忍受的缺陷?
30秒到达战场
HUH函数