嵌套的 EnumWindows class delphi
EnumWindows in a nested class delphi
我在 EnumWindows
函数中遇到了一些问题,该函数使用嵌套 class 中的回调函数:
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
指向不可访问的值。
如果在表单中将回调函数声明为私有,所有这些工作正常,但是当我试图在嵌套中将此函数设为私有时 class 它出错了。
为什么?以及如何使它起作用?目标是使 FEnumWindowsCallback
和所有其他相关函数在 TProcessWatch
.
中私有化
回调声明错误。应该是:
class function EnumWindowsCallback(hWindow: HWND;
lParam: LPARAM): BOOL; static; stdcall;
您使用了错误的调用约定和实例方法。
其他评论:
EnumCallbackParam
已经是一个指针。您可以将其作为参数传递。
- 强制转换为
LPARAM
而不是 LongInt
,这样如果您编译为 64 位,您的代码也能正常工作。
export
关键字在 32 位或 64 位 Delphi 中没有意义。它会被忽略,您不应该使用它,因为它会增加混乱并可能造成混淆。
我在 EnumWindows
函数中遇到了一些问题,该函数使用嵌套 class 中的回调函数:
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
指向不可访问的值。
如果在表单中将回调函数声明为私有,所有这些工作正常,但是当我试图在嵌套中将此函数设为私有时 class 它出错了。
为什么?以及如何使它起作用?目标是使 FEnumWindowsCallback
和所有其他相关函数在 TProcessWatch
.
回调声明错误。应该是:
class function EnumWindowsCallback(hWindow: HWND;
lParam: LPARAM): BOOL; static; stdcall;
您使用了错误的调用约定和实例方法。
其他评论:
EnumCallbackParam
已经是一个指针。您可以将其作为参数传递。- 强制转换为
LPARAM
而不是LongInt
,这样如果您编译为 64 位,您的代码也能正常工作。 export
关键字在 32 位或 64 位 Delphi 中没有意义。它会被忽略,您不应该使用它,因为它会增加混乱并可能造成混淆。