EnumWindows и callback в виде лямбды
От: FrozenHeart  
Дата: 12.12.13 14:21
Оценка:
Приветствую, это снова я.

Есть в 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, а что там используется в лямбде — это уже детали реализации)?
avalon/1.0.433
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.