在c ++中,人们可以这样做:
HWND g_HWND=NULL;
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam)
{
DWORD lpdwProcessId;
GetWindowThreadProcessId(hwnd,&lpdwProcessId);
if(lpdwProcessId==lParam)
{
g_HWND=hwnd;
return FALSE;
}
return TRUE;
}
EnumWindowsProcMy,m_ProcessId);
(link)
德尔福翻译将是:
function GetWindowHandle(ProcessId: Cardinal): THandle;
var
hFound: THandle;
function EnumWindowsProcMy(_hwnd: HWND; ProcessId: Cardinal): BOOL; stdcall;
var
dwPid: Cardinal;
begin
GetWindowThreadProcessId(_hwnd, @dwPid);
if ProcessId = dwPid then
begin
hFound := _hwnd;
Result := False;
end
else
Result := True;
end;
begin
EnumWindows(@EnumWindowsProcMy, LPARAM(ProcessId));
Result := hFound;
end;
然而,似乎"嵌入式"函数无法正确访问变量 hFound 。
如果我在函数(全局变量)之外声明变量,它可以正常工作。但这在设计上很糟糕。
解决这个问题的一种方法是将记录传递给 EnumWindowProcMy 并将所需的句柄保存在那里。
但是我想知道为什么代码不起作用,因为我认为我正确地翻译了它。
答案 0 :(得分:1)
不要使用"嵌入式"功能。像使用C ++代码一样使用独立函数。
嵌套函数不能作为指针传递。一个好的经验法则是,如果必须使用@
运算符让编译器允许您传递函数指针,那么它的可能错误。始终首先尝试不使用@
运算符的函数指针。编译器可能会以这种方式检测错误。
如果您不想使用全局变量,但需要将多个信息单元传递给回调函数,则需要使用记录。 C ++代码不使用记录,因为它使用全局变量。这就是你的翻译偏离原文的地方。