На главную Наши проекты:
Журнал   ·   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
  
> Warnings при отладке , Что они значат?
    Привет всем!
    Проверил свою прогу на утечку памяти, все баги устранил, но при этом в окне дебага ещё есть около сотни разых ворнингов (моя программа большая, подключаеться 7 моих длл). Все они сводятся к 5 видам (внизу все перечислены). Подскажите как устранить причину их вызвавшую, или что вы думаете по этому поводу. Пробовал разобраться в этом сам, прошел по свем DestroyWindow в программе но так ничего и не нашел. Подозреваю что это что-то глубже чем только DestroyWindow. Заранее спасибо.

    1) Warning: no document names in string for template #129.
    2) Warning: no message line prompt for ID 0xE001.
    3) Warning: skipping non-radio button in group.
    4) Warning: calling DestroyWindow in CDialog::~CDialog -- OnDestroy or PostNcDestroy in derived class will not be called.
    5) Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.
      2) Для пункта меню не установлен обработчик
      3) Среди группы radio-button'ов есть, например, checkbox
      4), 5) В деструкторе вызываешь DestroyWindow
        Цитата J0ker @
        2) Для пункта меню не установлен обработчик
        3) Среди группы radio-button'ов есть, например, checkbox
        4), 5) В деструкторе вызываешь DestroyWindow

        2) Для пункта меню не установлен обработчик - понял всё
        3) Среди группы radio-button'ов есть, например, checkbox - думаю что понял тоже
        4), 5) В деструкторе вызываешь DestroyWindow - в каком деструкторе? Как это можно обнаружить? Подробнее если можно и не трудно. Я не ламер - должен понять :D . Спасибо.
          Поиши DestroyWindow в FindInFiles.

          Добавлено
          1) Тоже понял. Неправильно составил строку в ресурсах для определенного типа документа (посмотри по id)
            Цитата J0ker @
            Поиши DestroyWindow в FindInFiles.

            Добавлено
            1) Тоже понял. Неправильно составил строку в ресурсах для определенного типа документа (посмотри по id)

            DestroyWindow искал но все вызываються правильно, но не искал в длл - может там, поищу сейчас. Заодно гляну и про ID. Roger.
              Насколько я понимаю, нельзя его вызывать только в деструкторе...
              Хотя, честно говоря, за 3 года, пока я юзал MFC, ни разу DestroyWindow не пользовался.
                Цитата J0ker @
                Насколько я понимаю, нельзя его вызывать только в деструкторе...
                Хотя, честно говоря, за 3 года, пока я юзал MFC, ни разу DestroyWindow не пользовался.

                Предлагаеш удалить все все DestroyWindow? Варнинг первый исчез после добавления строкового ресурса в String table. Ищу причину второго варнинга. OK.

                Добавлено
                Второй варнинг (Warning: no message line prompt for ID 0xE001.) 0xE001->57345. Поиск по 57345 результатов не дал и в длл тожею Что делать?
                  Цитата FockuSS @
                  Предлагаеш удалить все все DestroyWindow?

                  Наоборот. Нужно его вызвать, когда окно стало не нужно.
                  Подробности см. в MSDN - TN017
                    Цитата FockuSS @
                    Второй варнинг (Warning: no message line prompt for ID 0xE001.) 0xE001->57345. Поиск по 57345 результатов не дал и в длл тожею Что делать?

                    Тогда не парься :)
                    Судя по красоте ID, это какой-то стандартный
                      Вот такое сообщение в отладке появилось.
                      Цитата
                      winfrm.cpp(1628) : AppMsg - Warning: no message line prompt for ID 0x0098.

                      В главном окне class CMainFrame : public CFrameWndEx есть:
                      #define WM_WORK (WM_APP + 1)
                      #define WORK_SCAN_ZERO (WM_APP + 22)
                      ON_MESSAGE(WM_WORK, &CMainFrame::OnWork)
                      ON_MESSAGE(WORK_SCAN_ZERO, &CMainFrame::OnScanZero)

                      Из других окон и потоков для обмена информацией (это не меню) используется так:
                      if (hwndApp) ::PostMessageW(hwndApp, WM_WORK, static_cast<WPARAM>(thr.u.m_all), static_cast<LPARAM>(count));
                      if (hwndApp) ::PostMessageW(hwndApp, WORK_SCAN_ZERO, NULL, reinterpret_cast<LPARAM>(m_SelDev));

                      Вот такое сообщение появляется при работе второй строки.
                      Ее вызывает: void CFrameWnd::GetMessageString(UINT nID, CString& rMessage) const

                      Нафига? И как обмениваться сообщениями тогда, чтоб не дергалась эта функция?
                        Провел тест
                        В Главном окне добавил виртуальную функцию с вызовом далее по цепочке GetMessageString.

                        if (hwndApp) ::PostMessageW(hwndApp, WM_WORK, static_cast<WPARAM>(thr.u.m_all), static_cast<LPARAM>(count));
                        Вызывается из потока, обращений к GetMessageString нет

                        if (hwndApp) ::PostMessageW(hwndApp, WORK_SCAN_ZERO, NULL, reinterpret_cast<LPARAM>(m_SelDev));
                        Вызывается из одной дочерней вьюшки, и тут вызывается GetMessageString.
                          https://www.codeproject.com/Questions/65145...s-main-applicat

                          Добавлено
                          Тут еще можно почитать причины: http://rsdn.org/forum/tools/288243.all

                          А так сложно сказать. Нужен номер варнинга. Так же нужно видеть как объявлен ресурс с номером 0x0098
                            Wound
                            Нету тут варнингов.
                            И ресурс у меня не используется
                            ExpandedWrap disabled
                              void CFrameWnd::GetMessageString(UINT nID, CString& rMessage) const
                              {
                                  // load appropriate string
                                  LPTSTR lpsz = rMessage.GetBuffer(255);
                                  if (AfxLoadString(nID, lpsz) != 0)
                                  {
                                      // first newline terminates actual string
                                      lpsz = _tcschr(lpsz, '\n');
                                      if (lpsz != NULL)
                                          *lpsz = '\0';
                                  }
                                  else
                                  {
                                      // not found
                                      TRACE(traceAppMsg, 0, "Warning: no message line prompt for ID 0x%04X.\n", nID);
                                  }
                                  rMessage.ReleaseBuffer();
                              }

                            Но почему, в одном случае PostMessageW проходит гладко, а в другом случае почему-то лезет искать строку???
                            Если в исходниках пошариться на вызов GetMessageString, то он в основном используется для получение Промта у контролов и так же в этой функции
                            ExpandedWrap disabled
                              LRESULT CFrameWnd::OnSetMessageString(WPARAM wParam, LPARAM lParam)
                              {
                                  UINT nIDLast = m_nIDLastMessage;
                                  m_nFlags &= ~WF_NOPOPMSG;
                               
                                  CWnd* pMessageBar = GetMessageBar();
                                  if (pMessageBar != NULL)
                                  {
                                      LPCTSTR lpsz = NULL;
                                      CString strMessage;
                               
                                      // set the message bar text
                                      if (lParam != 0)
                                      {
                                          ASSERT(wParam == 0);    // can't have both an ID and a string
                                          lpsz = (LPCTSTR)lParam; // set an explicit string
                                      }
                                      else if (wParam != 0)
                                      {
                                          // map SC_CLOSE to PREVIEW_CLOSE when in print preview mode
                                          if (wParam == AFX_IDS_SCCLOSE && m_lpfnCloseProc != NULL)
                                              wParam = AFX_IDS_PREVIEW_CLOSE;
                               
                                          // get message associated with the ID indicated by wParam
                                       //NT64: Assume IDs are still 32-bit
                                          GetMessageString((UINT)wParam, strMessage);
                                          lpsz = strMessage;
                                      }
                                      pMessageBar->SetWindowText(lpsz);
                               
                                      // update owner of the bar in terms of last message selected
                                      CFrameWnd* pFrameWnd = pMessageBar->GetParentFrame();
                                      if (pFrameWnd != NULL)
                                      {
                                          pFrameWnd->m_nIDLastMessage = (UINT)wParam;
                                          pFrameWnd->m_nIDTracking = (UINT)wParam;
                                      }
                                  }
                               
                                  m_nIDLastMessage = (UINT)wParam;    // new ID (or 0)
                                  m_nIDTracking = (UINT)wParam;       // so F1 on toolbar buttons work
                                  return nIDLast;
                              }
                            Сообщение отредактировано: Black_Dragon -
                              Ты смотришь АПИ функции MFC, а нужно смотреть свой код. Он у тебя ругается на контрол с ID 0x0098, переведи его в десятиричную систему и поищи по своим исходникам. Либо что это за ресурс с ID 0x0098 ?
                              Как он используется и где?

                              Это не вот это вот случаем?
                              ExpandedWrap disabled
                                ::PostMessageW(hwndApp, WORK_SCAN_ZERO, NULL, reinterpret_cast<LPARAM>(m_SelDev));

                              ?

                              Добавлено
                              Я пока не понимаю что у тебя происходит и где. Это не очевидно из того, что ты написал. Потому что ты просто написал про АПИшные MFC функции. Ну и ? Ну есть там такая проверка, и... что?
                              Сообщение отредактировано: Wound -
                                Wound
                                Действительно, наложились два участка кода, мой и MFC
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0382 ]   [ 16 queries used ]   [ Generated: 23.04.24, 21:20 GMT ]