В 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
Следует избавиться от этих дефайнов, они совершенно ни к чему. Установка указателя на пользовательские данные сделана неправильно, указатель кастуется в тип 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
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Зачем нужен спецификатор private в C++, если по умолчанию итак все функции и переменные являются закрытыми?
Есть число nКак объявить функцию n переменных одного типа? Ситуация примерно такая:
Ребят, помогите найти код алгоритма COS(дискретное логарифмирование), очень надо