На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Отладчик выбрасывает исключение
    Я пишу программу на C++ в среде разработки Visual Studio 2012.

    В моей программе на диалоговом окне размещены в одном месте две таблицы (CListCtrl) -- m_IDC_LIST1 и m_IDC_LIST3.
    В результате программных вычислений вставляются строки в таблицы m_IDC_LIST1 и m_IDC_LIST3.
    Переключение между таблицами на диалоговом окне между этими двумя таблицами осуществляется путём нажатия кнопок ">>" и "<<".
    Код обработки нажатия этих кнопок следующий:

    1) кнопка ">>" :

    ExpandedWrap disabled
      m_IDC_LIST1.ShowWindow(SW_HIDE);
      m_IDC_LIST3.ShowWindow(SW_SHOW);


    2) кнопка "<<" :

    ExpandedWrap disabled
      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 :

    ExpandedWrap disabled
      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 останавливается на строке

    ExpandedWrap disabled
      return  ::CallWindowProc(m_pfnSuper, m_hWnd, nMSg, wParam, lParam);


    В чём причина этого? Как исправить эту ошибку?
    Сообщение отредактировано: erslgoeirjh -
      Лучше прикрепите свой код, а не кусок стандартного инклюда. Проблема явно не в нем. Но суть ошибки такая: Вы передали в виде callback указателя что-то не то со значением 0x3CBEC861
        erslgoeirjh,

        А эта строка :
        ExpandedWrap disabled
          if ((pfnWndProc =* GetSuperWndProcAddr())==NULL)

        Обязательно надо
        ExpandedWrap disabled
          =*

        ?
          Цитата ЫукпШ @


          Файл wincore.cpp -- файл разработчиков Visual Studio, а не мой.
            Цитата ЫукпШ @
            Обязательно надо

            Учитывая, что == вычисляется как 0 или 1 строго, тогда =* просто обнуление в случае отсутствия значения (== NULL).
            Не знаю типа результата GetSuperWndProcAddr, но это похоже на обнуление результата в случае отсутствия значения.

            Добавлено
            Чуть поискав

            ExpandedWrap disabled
              WNDPROC* CWnd::GetSuperWndProcAddr() { return &m_pfnSuper; }


            Получается, что pfnWndProc обнуляется, если значение m_pfnSuper отсутствует.
            Сформулирую по другому.
            Разыменовывая значение из указателя/ссылки и записывая его в pfnWndProc проверяем на NULL. После используем один из двух способов дальнейшей обработки события.
            В данном случае * это эквивалент [], а не умножения.
            Сообщение отредактировано: macomics -
              macomics, если проще - GetSuperWndProcAddr() возвращает адрес где хранится указатель на оконную процедуру суперкласса. По сути - указатель на указатель. Поэтому и нужно применять оператор разыменования *.
                Может глупый вопрос, а у вас правильно сделана привязка m_IDC_LIST3 к соответствующему RESOURCE_ID через DDX_Control??
                Хотя может быть проблема в этом -> Visual Studio 2012. На какой системе установлена?
                  Проблема решена. Просто перед выводом строк в m_IDC_LIST3 были математические вычисления, в который был выход за пределы массива. Я увеличил размерность массива и всё теперь нормально работает.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0315 ]   [ 16 queries used ]   [ Generated: 31.10.25, 03:48 GMT ]