Некорректное определение CALLBACK функции

Если функция ( BOOL CALLBACK enumWindowsProc(HWND hwnd, LPARAM lParam) ), применяемая к окнам в EnumWindows. При использовании вне класса, все работает ок, а при нахождении функций в классе: ошибка

Класс выглядит так.

Я так понимаю, проблема в том, что функция определяется как коллбек класса. Как можно это исправить?


Ответы (1 шт):

Автор решения: ori

Нельзя передавать указатель на функцию-член туда, куда нужно передавать указатель на функцию...

Делается обход ограничения примерно так:

BOOL
CALLBACK
EnumWindowsRedirect(HWND, LPARAM);

struct ModuleCheckerData {
    class ModuleChecker *checker;
    /* Другие нужные поля.... */
};

class ModuleChecker {
public:
    BOOL enumWindowsProc(HWND hWnd/* нужные тубу параметры... */);
    ...
};

BOOL
EnumWindowsRedirect(HWND hWnd, LPARAM userData) {
    ModuleChecker *moduleChecker
        = reinterpret_cast<ModuleChecker *>(userData);

    return
        nullptr != moduleChecker
            ? moduleChecker->enumWindowsProc(hWnd, ...)
            : FALSE;
}

/* Вызов: */

void a() {
    ModuleChecker moduleChecker;
    ModuleCheckerData data { &moduleChecker };
    EnumWindows(EnumWindowsRedirect, reinterpret_cast<LPARAM>(&data));
}

P.S.

Прошу заметить одну вещь, указатель в функции редиректа, кастуется именно на указатель класса, т.к. там первым полем лежит указатель на класс. Если нужно получить доступ к полям другим, нужно добавить еще один указатель с типом ModuleCheckerData, и читать поля оттуда.

→ Ссылка