EnumChildWindows and lambda

EnumChildWindows and lambda

本文关键字:lambda and EnumChildWindows      更新时间:2023-10-16

当我尝试在 MinGW 4.6.2 上编译以下内容时

EnumChildWindows(hwnd, [](HWND, LPARAM) -> BOOL { return TRUE; }, 0);

我得到

error: cannot convert '<lambda(HWND, LPARAM)>'
to 'ENUMWINDOWSPROC {aka int (*)(HWND__*,long int)}'
for argument '2' to 'BOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM)'

我是否正确地声明了 lambda,或者这根本不起作用?回调的 MS 定义是

BOOL CALLBACK EnumChildProc(
  __in  HWND hwnd,
  __in  LPARAM lParam
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633493%28v=vs.85%29.aspx

是调用约定导致问题吗?

布尔回调 EnumChildProc(...)

这就是问题所在,CALLBACK 宏将 __stdcall 属性应用于函数以更改默认设置的调用约定。 这在大多数程序中都是__cdecl的。 您无法控制 lambda 的调用约定,只能通过更改全局设置(/Gz 编译选项)来控制。 这可能会产生比你关心的更多的副作用,放弃这个lamda。

顺便说一句,64 位代码不是问题。