Есть такой код, находящий окно с заданным заголовком:
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*/ компилятор выдает ошибку:
[C++ Error] DATA.cpp(158): E2034 Cannot convert 'int (__stdcall * (_closure )(void *,long))(void *,long)' to 'int (__stdcall *)()'
[C++ Error] DATA.cpp(158): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall * (_closure )(void *,long))(void *,long)')
Почему он думает, что функция EnumWindowsProc() должна быть без параметров?
Здравствуйте, 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
Здравствуйте, 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