首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EnumWindows在64位Delphi中的古怪行为

EnumWindows在64位Delphi中的古怪行为
EN

Stack Overflow用户
提问于 2015-06-01 13:09:32
回答 1查看 1.5K关注 0票数 4

我在德尔福XE3工作,在64位的Windows 8机器上工作,构建32位和64位的应用程序.

给定进程ID,我使用EnumWindows查找进程主窗口的窗口句柄,代码使用回调例程中的LPARAM参数传递指向记录的指针。

我正在使用的代码在32位构建中工作得很好。

当我编译和运行64位构建时,它失败了。出现此问题是因为LPARAM值似乎是在Wnd参数中传递的。Param值总是设置为$FFFF ..。换句话说,我根本不传递HWND值.因此,这并不是通过参数交换的方式。

代码语言:javascript
复制
type
  PEnumInfo = ^TEnumInfo;
  TEnumInfo = record
    ProcessID : DWORD;
    HWND      : THandle;
  end;

function EnumWindowsProc(Wnd: HWND;  Param : LPARAM): Bool; stdcall;
    var
      PID : DWORD;
      PEI : PEnumInfo;
    begin
// in 32-bit Param matches the address of the param that is passed
// in 64-bit Param is set to $FFFF - however Wnd = the expected address
      ShowMessage('PEI = '+IntToStr(Param));

      PEI := PEnumInfo(Param);
      GetWindowThreadProcessID(Wnd, @PID);

// the code fails at this next line in 64-bit build because PEI = $FFFF rather than the actual pointer passed
      Result := (PID <> PEI^.ProcessID) or
              (not IsWindowVisible(WND)) or
              (not IsWindowEnabled(WND));

      if not Result then PEI^.HWND := WND; //break on return FALSE
    end;


    function FindMainWindow(PID: DWORD): DWORD;
    var
      EI : TEnumInfo;
    begin
      EI.ProcessID := PID;
      EI.HWND := 0;
      ShowMessage('PEI = '+IntToStr(LPARAM(@EI)));
      EnumWindows(@EnumWindowsProc, LPARAM(@EI));
      Result := EI.HWND;
    end;

Win64的呼叫约定不同吗?还是我犯了别的根本错误?

感激地接受任何帮助或想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-01 13:44:26

你问题中的代码运行得很好。你关于EnumWindowsProc的声明是正确的。参数和返回值具有正确的类型。调用约定是正确的,尽管这对只有一个调用约定的x64并不重要。

如果使用问题中的代码构建一个简单的应用程序,您将发现它的行为是正确的,并且枚举窗口是正确的。

问题是,您的实际代码肯定与您显示的代码不同。我的猜测是,在实际代码中,EnumWindowsProc是一个嵌套函数:Why cannot take address to a nested local function in 64 bit Delphi?,但这只是猜测。我不知道你真正的密码是什么样子。我知道问题中的代码是正确的。

另一个注释是,您错误地将HWND成员声明为THandle类型。这不会影响程序的正确性,但在语义上是错误的。我宣布这种类型如下:

代码语言:javascript
复制
type
  TEnumInfo = record
    PID: DWORD;
    Wnd: HWND;
  end;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30574405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档