Отладчик выбрасывает исключение
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.106] |
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online
Отладчик выбрасывает исключение
|
Сообщ.
#1
,
|
|
|
|
Я пишу программу на C++ в среде разработки Visual Studio 2012.
В моей программе на диалоговом окне размещены в одном месте две таблицы (CListCtrl) -- m_IDC_LIST1 и m_IDC_LIST3. В результате программных вычислений вставляются строки в таблицы m_IDC_LIST1 и m_IDC_LIST3. Переключение между таблицами на диалоговом окне между этими двумя таблицами осуществляется путём нажатия кнопок ">>" и "<<". Код обработки нажатия этих кнопок следующий: 1) кнопка ">>" : ![]() ![]() m_IDC_LIST1.ShowWindow(SW_HIDE); m_IDC_LIST3.ShowWindow(SW_SHOW); 2) кнопка "<<" : ![]() ![]() m_IDC_LIST3.ShowWindow(SW_HIDE); m_IDC_LIST1.ShowWindow(SW_SHOW); Первоначально отображается таблица m_IDC_LIST1 (SW_SHOW), а таблица m_IDC_LIST3 не отображается (SW_HIDE). После нажатия на кнопку "Расчёт" данные таблице m_IDC_LIST1 правильно отображаются, а при нажатии после этого на кнопку ">>" для отображения таблицы m_IDC_LIST3 в отладчике выскакивает исключение: Цитата Необработанное исключение по адресу 0x3CBEC861 в BNOISZ.exe: 0xC000041D: Во время обратного вызова пользователя обнаружено необработанное исключение. При этом отображается файл wincore.cpp и функция в нём CWnd::DefWIndowProc : ![]() ![]() LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam) { if (m_pfnSuper!=NULL) return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam); WNDPROC pfnWndProc; if ((pfnWndProc =* GetSuperWndProcAddr())==NULL) return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam); else return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam); } При этом курсор в файле wincore.cpp останавливается на строке ![]() ![]() return ::CallWindowProc(m_pfnSuper, m_hWnd, nMSg, wParam, lParam); В чём причина этого? Как исправить эту ошибку? |
|
Сообщ.
#2
,
|
|
|
|
Лучше прикрепите свой код, а не кусок стандартного инклюда. Проблема явно не в нем. Но суть ошибки такая: Вы передали в виде callback указателя что-то не то со значением 0x3CBEC861
|
|
Сообщ.
#3
,
|
|
|
|
erslgoeirjh,
А эта строка : ![]() ![]() if ((pfnWndProc =* GetSuperWndProcAddr())==NULL) Обязательно надо ![]() ![]() =* ? |
|
Сообщ.
#4
,
|
|
|
|
Цитата ЫукпШ @ Файл wincore.cpp -- файл разработчиков Visual Studio, а не мой. |
|
Сообщ.
#5
,
|
|
|
|
Цитата ЫукпШ @ Обязательно надо Не знаю типа результата GetSuperWndProcAddr, но это похоже на обнуление результата в случае отсутствия значения. Добавлено Чуть поискав ![]() ![]() WNDPROC* CWnd::GetSuperWndProcAddr() { return &m_pfnSuper; } Сформулирую по другому. Разыменовывая значение из указателя/ссылки и записывая его в pfnWndProc проверяем на NULL. После используем один из двух способов дальнейшей обработки события. В данном случае * это эквивалент [], а не умножения. |
|
Сообщ.
#6
,
|
|
|
|
macomics, если проще - GetSuperWndProcAddr() возвращает адрес где хранится указатель на оконную процедуру суперкласса. По сути - указатель на указатель. Поэтому и нужно применять оператор разыменования *.
|
|
Сообщ.
#7
,
|
|
|
|
Может глупый вопрос, а у вас правильно сделана привязка m_IDC_LIST3 к соответствующему RESOURCE_ID через DDX_Control??
Хотя может быть проблема в этом -> Visual Studio 2012. На какой системе установлена? |
|
Сообщ.
#8
,
|
|
|
|
Проблема решена. Просто перед выводом строк в m_IDC_LIST3 были математические вычисления, в который был выход за пределы массива. Я увеличил размерность массива и всё теперь нормально работает.
|