Исключение в ucrtbased.dll и callback

205
17 декабря 2017, 10:37

В Windows 10 что-то не так, ucrtbased.dll плюется исключениями:

Необработанное исключение по адресу 0x542FF4E9 (ucrtbased.dll) в some.exe: 0xC000041D: Во время обратного вызова пользователя обнаружено необработанное исключение.

#if !_WIN64
#define swinp SetWindowLong
#define gwinp GetWindowLong
#define WINC_PTR GWL_USERDATA
#else
#define swinp SetWindowLongPtr
#define gwinp GetWindowLongPtr
#define WINC_PTR GWLP_USERDATA
#endif // _WIN64

Код в котором происходит исключение:

LRESULT window_base::p_msg_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    window_base* self_;
    if (uMsg == WM_NCCREATE)
    {
        swinp(hWnd, WINC_PTR, LONG(LPCREATESTRUCT(lParam)->lpCreateParams));
        return TRUE;
    }
    self_ = reinterpret_cast<window_base*>(gwinp(hWnd, WINC_PTR));
    if (!self_)
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    // Именно тут
    return self_->msg_proc(hWnd, uMsg, wParam, lParam);
}

Объявление msg_proc это чисто виртуальная ф-ция protected:

virtual LRESULT WINAPI msg_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) = 0;

Номер сообщения при котором выбрасывается исключения: WM_CANCELMODE

Answer 1

Следует избавиться от этих дефайнов, они совершенно ни к чему. Установка указателя на пользовательские данные сделана неправильно, указатель кастуется в тип LONG, тем самым потенциально портится.

if(WM_NCCREATE == uMsg)
{
    assert(0 != lParam);
    auto const & params{*reinterpret_cast<::LPCREATESTRUCT>(lParam)};
    auto const old_value{::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterptre_cast<::LONG_PTR>(params.lpCreateParams))}
    assert(0 == old_value);
    return TRUE;
}

Также проверьте код, который присваивает значение полю lpCreateParams.

READ ALSO
Зачем нужен спецификатор PRIVATE в C++

Зачем нужен спецификатор PRIVATE в C++

Зачем нужен спецификатор private в C++, если по умолчанию итак все функции и переменные являются закрытыми?

266
Лидирующий &ldquo;0&rdquo; в std::atoi

Лидирующий “0” в std::atoi

Вот такой код выводит "10" в консоль (VS2017):

223
Объявление функции n переменных

Объявление функции n переменных

Есть число nКак объявить функцию n переменных одного типа? Ситуация примерно такая:

205
Реализация алгоритма COS

Реализация алгоритма COS

Ребят, помогите найти код алгоритма COS(дискретное логарифмирование), очень надо

181