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

Я так понимаю, проблема в том, что функция определяется как коллбек класса. Как можно это исправить?
Ответы (1 шт):
Нельзя передавать указатель на функцию-член туда, куда нужно передавать указатель на функцию...
Делается обход ограничения примерно так:
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, и читать поля оттуда.
