首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套类delphi中的EnumWindows

嵌套类delphi中的EnumWindows
EN

Stack Overflow用户
提问于 2015-04-13 21:07:41
回答 1查看 196关注 0票数 2

对于使用嵌套类回调函数的EnumWindows函数,我遇到了一些问题:

代码语言:javascript
运行
复制
TProcessWatch = class(TObject)
private
  ...
  type
    TProcessInfo = class(TObject)
    private
    type
      PEnumCallbackParam = ^TEnumCallbackParam;
      TEnumCallbackParam = class
        A : Integer;
        ...
      end;
    private
      FOwner : TProcessWatch;
      function FEnumWindowsCallback(hWindow : HWND; lParam : LPARAM) : BOOL; export;
      procedure SomeProc;
      ...
    end;
private
  FProcesses : TProcessInfo;
  ...
public
  ...

SomeProc中有一个对EnumWindows的调用

代码语言:javascript
运行
复制
EnumCallbackParam := TEnumCallbackParam.Create;
try
  EnumCallbackParam.A := 0;
  EnumWindows(@TProcessWatch.TProcessInfo.FEnumWindowsCallback, LongInt(@EnumCallbackParam));
  ...
finally
  EnumCallbackParam.Free;
end;

下面是一个FEnumWindowsCallback函数清单:

代码语言:javascript
运行
复制
function TProcessWatch.TProcessInfo.FEnumWindowsCallback(hWindow: HWND;
  lParam : LPARAM): BOOL; export;
var
  CallbackParam : PEnumCallbackParam;
begin
  CallbackParam := Pointer(lParam); // A is inaccessible
  Result := True;
  ...
end;

在运行时,当调用EnumWindows时,FEnumWindowsCallback总是接收hWindow = 0,而lParam指向不可访问的值。

如果回调函数在表单中声明为私有函数,那么所有这些都可以正常工作,但是当我试图在嵌套类中使该函数私有时,就出错了。

为什么?怎样才能让这件事奏效?目标是使FEnumWindowsCallback和所有其他涉及到的函数在TProcessWatch中成为私有函数。

EN

Stack Overflow用户

回答已采纳

发布于 2015-04-13 21:13:28

回调被错误地宣布了。它应该是:

代码语言:javascript
运行
复制
class function EnumWindowsCallback(hWindow: HWND; 
  lParam: LPARAM): BOOL; static; stdcall; 

您使用了错误的调用约定和实例方法。

其他评论:

  • EnumCallbackParam已经是一个指针。你可以把它当作副词传递。
  • 转换为LPARAM而不是LongInt,这样如果编译到64位,代码就可以工作。
  • export关键字在32位或64位Delphi中没有任何意义。它被忽略,您不应该使用它,因为它增加了混乱和可能混淆。
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29615120

复制
相关文章

相似问题

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