对于使用嵌套类回调函数的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
中成为私有函数。
发布于 2015-04-13 21:13:28
回调被错误地宣布了。它应该是:
class function EnumWindowsCallback(hWindow: HWND;
lParam: LPARAM): BOOL; static; stdcall;
您使用了错误的调用约定和实例方法。
其他评论:
EnumCallbackParam
已经是一个指针。你可以把它当作副词传递。LPARAM
而不是LongInt
,这样如果编译到64位,代码就可以工作。export
关键字在32位或64位Delphi中没有任何意义。它被忽略,您不应该使用它,因为它增加了混乱和可能混淆。https://stackoverflow.com/questions/29615120
复制相似问题