【发布时间】: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 = 0 而lParam 指向不可访问的值。
如果回调函数在表单中声明为私有,所有这些都可以正常工作,但是当我尝试在嵌套类中将此函数设为私有时,它出错了。
为什么?以及如何使其工作?目标是使FEnumWindowsCallback 和所有其他涉及的函数在TProcessWatch 中成为私有。
【问题讨论】: