Run-Time Check Failure #0 После записи указателя на метод класса

157
19 января 2020, 19:50

Делаю колбэк на изменения размеров окна, и реагирования на изменение размера рендерера. Хорошо, объявил typedef, класс окна и класс рендерера находятся в разных библиотеках. Сделал объявление:

class renderer;
typedef bool(__thiscall renderer::*renderer_resize_callback_t)(unsigned, unsigned) const;

Далее, после того как рендерер был создан, записываю указатель на метод ресайза в класс окна:

class API_WINDOWS window
{
    ...
    renderer *p_renderer_;
    renderer_resize_callback_t m_resize_callback_t_;
public:
    ...
    void set_resize_callback(direct2d::renderer_resize_callback_t resize_callback_t);
};
void window::set_resize_callback(const renderer_resize_callback_t resize_callback_t)
{
    m_resize_callback_t_ = resize_callback_t;
}
class API_RENDERER renderer
{
protected:
    ID2D1Factory* p_factory_;
    ID2D1HwndRenderTarget* p_render_target_;
public:
    renderer(const void* window_handle, int w, int h);
    ~renderer();
    void draw() const;
    bool __thiscall resize_target(unsigned width, unsigned height) const;
    renderer() = delete;
    renderer(const renderer&) = delete;
    renderer(const renderer&&) = delete;
    renderer& operator=(const renderer&) = delete;
    renderer& operator=(const renderer&&) = delete;
};
bool __thiscall renderer::resize_target(const unsigned width, const unsigned height) const
{
    const HRESULT result = p_render_target_->Resize(D2D1::SizeU(width, height));
    return !(FAILED(result));
}

Далее пытаюсь записать указатель на класс рендерера и на метод ресайза в класс вызовом метода set_resize_callback:

window wnd(1024, 768);
renderer renderer(wnd.get_window_handle(), 1024, 768);
wnd.set_renderer(&renderer);
wnd.set_resize_callback(&renderer::resize_target);

Но после того как будет вызван метод, произойдет исключение:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Как я понял в нем говорится о том, что не совпадает соглашение о вызовах, и оно повредило стэк. Но как? В определении прототипа явно указано соглашение, так же как и у метода.

Можно ли это исправить?

READ ALSO
Как связать dbcc_name из PDEV_BROADCAST_DEVICEINTERFACE и mount point?

Как связать dbcc_name из PDEV_BROADCAST_DEVICEINTERFACE и mount point?

После вставки носителя я получу сначала событие dbch_devicetype с deviceinterface, а затем с volume и если накопитель вставлялся 1, то очевидно оба события будут...

140
Как можно получить размер файла

Как можно получить размер файла

Я получаю параметры с командной строки cmd и вывожу их, затем нужно найти в этой папке с которой запущен скрипт файл с наибольшим размером,...

153
Ошибка C2864 при работе с OpenCV

Ошибка C2864 при работе с OpenCV

Кто сталкивался с данной проблемой при работе с OpenCV? Язык С++, работаю в VS2013

155