 Отладчик выбрасывает исключение
    Отладчик выбрасывает исключение
    
  |  | Наши проекты: Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.107] | 
|   | 
 | 
 Правила раздела Visual C++ / MFC / WTL (далее Раздела)
    Правила раздела Visual C++ / MFC / WTL (далее Раздела)
   FAQ Раздела
 FAQ Раздела   Обновления для FAQ Раздела
 Обновления для FAQ Раздела    Поиск по Разделу
 Поиск по Разделу   MSDN Library Online
 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 были математические вычисления, в который был выход за пределы массива. Я увеличил размерность массива и всё теперь нормально работает.   |