Пытаюсь написать класс для замены диалоговой процедуры не статической функцией-членом любого класса, имеющей соответствующую сигнатуру.
Вот что имеем:
#pragma once
template <typename T>
class WndProcHooker
{
public:
typedef LRESULT ( CALLBACK T::* MWNDPROC )( HWND hwnd_, UINT msg_, WPARAM wparam_, LPARAM lparam_ );
WndProcHooker( HWND hwnd_, T * t_, MWNDPROC mem_proc_, bool hook_now_ = false )
: m_hwnd( hwnd_ ),
m_pt( t_ ),
m_mem_proc( mem_proc_ ),
m_proc( 0 )
{
m_this = this;
if ( hook_now_ )
hook();
}
bool hook()
{
if ( !m_proc )
m_proc = reinterpret_cast<WNDPROC>( ::SetWindowLongPtr( m_hwnd, GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>( _wnd_proc ) ) );
return !!m_proc;
}
~WndProcHooker()
{
try
{
::SetWindowLongPtr( m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>( m_proc ) );
}
catch ( ... )
{
}
}
private:
static LRESULT CALLBACK _wnd_proc( HWND hwnd_, UINT msg_, WPARAM wparam_, LPARAM lparam_ )
{
if ( !m_this )
return ::DefWindowProc( hwnd_, msg_, wparam_, lparam_ );
return m_this->m_pt->( *m_mem_proc )( hwnd_, msg_, wparam_, lparam_ );
}
static WndProcHooker * m_this;
WNDPROC m_proc;
HWND m_hwnd;
T * m_pt;
MWNDPROC m_mem_proc;
};
Инстанцируем шаблон:
struct C
{
LRESULT CALLBACK _wnd_proc( HWND hwnd_, UINT msg_, WPARAM wparam_, LPARAM lparam_ )
{
return 0;
}
};
void f()
{
C c;
WndProcHooker<C> h( 0, &c, &C::_wnd_proc );
}
return m_this->m_pt->( *m_mem_proc )( hwnd_, msg_, wparam_, lparam_ );
Компилятор (Visual C++ 9.0) жалуется в этом месте:
C2059: syntax error : '('
Где собака зарыта?