Приветствую, это снова я.
Есть в WinAPI функция под названием EnumWindows. Её объявление выглядит следующим образом:
BOOL WINAPI EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam
);
В качестве первого аргумента она принимает указатель на функцию, которая будет являться callback'ом при перечислении окон. WNDENUMPROC объявлен как
typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
В зависимости от различных обстоятельств, макрос CALLBACK может раскрываться либо в PASCAL (он, в свою очередь, либо в __pascal, либо ни во что), либо в __stdcall, либо вообще ни во что, заставляя использовать calling convention по умолчанию, который установлен в настройках проекта.
#ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endif
Я решил использовать функцию EnumWindows в своём классе следующим образом:
EnumWindows(
[](HWND cur_window_hwnd, LPARAM this_ptr) -> BOOL
{
find_window* instance = reinterpret_cast<find_window*>(this_ptr);
return instance->enum_windows_callback_impl(cur_window_hwnd);
}
, reinterpret_cast<LPARAM>(this)
);
В связи с тем, что это лямбда, не будет ли каких-либо проблем, связанных с несоответствием calling conventions (EnumWindows ожидает в качестве первого аргумента указатель на функцию с calling convention == CALLBACK, а что там используется в лямбде — это уже детали реализации)?