EnumWindows在嵌套类delphi中

时间:2015-04-13 21:07:41

标签: delphi winapi

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

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

的电话
EnumCallbackParam := TEnumCallbackParam.Create;
try
  EnumCallbackParam.A := 0;
  EnumWindows(@TProcessWatch.TProcessInfo.FEnumWindowsCallback, LongInt(@EnumCallbackParam));
  ...
finally
  EnumCallbackParam.Free;
end;

这是一个FEnumWindowsCallback函数列表:

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 = 0lParam指向无法访问的值。

如果回调函数在表单中声明为private,那么所有这一切都正常工作,但是当我试图在嵌套类中将此函数设为私有时,它就出错了。

为什么呢?以及如何使这个工作?目标是在FEnumWindowsCallback中将TProcessWatch和所有其他涉及的函数设为私有。

1 个答案:

答案 0 :(得分:4)

错误地声明了回调。它应该是:

class function EnumWindowsCallback(hWindow: HWND; 
  lParam: LPARAM): BOOL; static; stdcall; 

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

其他评论:

  • EnumCallbackParam已经是一个指针。你可以将它作为参数传递。
  • 转换为LPARAM而不是LongInt,以便在编译为64位时代码可以正常工作。
  • export关键字在32位或64位Delphi中没有意义。它被忽略,你不应该使用它,因为它增加了混乱,可能会混淆。