Ошибка компиляции
От: Ocenochka  
Дата: 18.07.06 09:43
Оценка:
Есть такой код, находящий окно с заданным заголовком:

   BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam)
   {
     char title[256];
     int res = GetWindowText(wnd, title, 255);
     char *result = strstr(title, "MyTitle");
     if (result != NULL)
       Count++;

     if (Count > 1)
       return false;
     else
       return true;
   }


   AnotherPrintWindow()
   {
     Count = 0;
/*1*/EnumWindows(&this->EnumWindowsProc, 0); 
     if (Count > 1)
       return true;
     else
       return false;
   }


В строке /*1*/ компилятор выдает ошибку:


Почему он думает, что функция EnumWindowsProc() должна быть без параметров?
Люблю ставить оценки.
Re: Ошибка компиляции
От: Ocenochka  
Дата: 18.07.06 09:52
Оценка:
Посмотрел в winuser.h — там правильная сигнатура функции.
Люблю ставить оценки.
Re: Ошибка компиляции
От: ekamaloff Великобритания  
Дата: 18.07.06 09:53
Оценка: 3 (1) +1
Здравствуйте, Ocenochka, Вы писали:

O> Почему он думает, что функция EnumWindowsProc() должна быть без параметров?


Дело не в этом. Функция EnumWindowsProc должна быть свободной функцией, а не методом класса, как в твоем случае
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Ошибка компиляции
От: Ocenochka  
Дата: 18.07.06 10:00
Оценка:
E>Дело не в этом. Функция EnumWindowsProc должна быть свободной функцией, а не методом класса, как в твоем случае
О!! Большое спасибо!
Люблю ставить оценки.
Re[3]: Ошибка компиляции
От: ekamaloff Великобритания  
Дата: 18.07.06 10:23
Оценка:
Здравствуйте, Ocenochka, Вы писали:

O> О!! Большое спасибо!


И еще.

Советую тебе использовать следующий переходник:

template<class T>
struct thunk_traits
{
    typedef BOOL (T::*method)(HWND);
    template<method M>
    struct thunk_maker
    {
        static BOOL CALLBACK thunk(HWND hwnd, LPARAM lParam) { return ((T*)(lParam)->*M)(hwnd); }
    };
};


, написанный по мотивам аналогичного thunk-а
Автор: Кодт
Дата: 07.01.06
Кодт

Тогда ты сможешь использовать в качестве callback-а метод класса, а не свободную функцию:

class MyClass {
public:
    BOOL EnumWindowsProc(HWND hwnd) {
        // ...
    }

    int AnotherPrintWindow() {
        Count = 0;
        ::EnumWindows(thunk_traits<MyClass>::thunk_maker<&MyClass::EnumWindowsProc>::thunk, (LPARAM)this);
        // ...
    }
    
    // ...
};


Но в таком случае lParam остается "зарезервированным" под нужды указателя this и другую дополнительную информацию через него передать уже не удастся. Впрочем это не такая уж большая потеря.

Удачи!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.