【问题标题】:EnumWindows in a nested class delphi嵌套类 delphi 中的 EnumWindows
【发布时间】:2015-04-14 05:25:41
【问题描述】:

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 指向不可访问的值。

如果回调函数在表单中声明为私有,所有这些都可以正常工作,但是当我尝试在嵌套类中将此函数设为私有时,它出错了。

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

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:

    回调声明错误。应该是:

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

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

    其他cmets:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多