Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.208.72] |
|
Сообщ.
#1
,
|
|
|
Привет всем!
Проверил свою прогу на утечку памяти, все баги устранил, но при этом в окне дебага ещё есть около сотни разых ворнингов (моя программа большая, подключаеться 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
,
|
|
|
2) Для пункта меню не установлен обработчик
3) Среди группы radio-button'ов есть, например, checkbox 4), 5) В деструкторе вызываешь DestroyWindow |
Сообщ.
#3
,
|
|
|
Цитата J0ker @ 2) Для пункта меню не установлен обработчик 3) Среди группы radio-button'ов есть, например, checkbox 4), 5) В деструкторе вызываешь DestroyWindow 2) Для пункта меню не установлен обработчик - понял всё 3) Среди группы radio-button'ов есть, например, checkbox - думаю что понял тоже 4), 5) В деструкторе вызываешь DestroyWindow - в каком деструкторе? Как это можно обнаружить? Подробнее если можно и не трудно. Я не ламер - должен понять . Спасибо. |
Сообщ.
#4
,
|
|
|
Поиши DestroyWindow в FindInFiles.
Добавлено 1) Тоже понял. Неправильно составил строку в ресурсах для определенного типа документа (посмотри по id) |
Сообщ.
#5
,
|
|
|
Цитата J0ker @ Поиши DestroyWindow в FindInFiles. Добавлено 1) Тоже понял. Неправильно составил строку в ресурсах для определенного типа документа (посмотри по id) DestroyWindow искал но все вызываються правильно, но не искал в длл - может там, поищу сейчас. Заодно гляну и про ID. Roger. |
Сообщ.
#6
,
|
|
|
Насколько я понимаю, нельзя его вызывать только в деструкторе...
Хотя, честно говоря, за 3 года, пока я юзал MFC, ни разу DestroyWindow не пользовался. |
Сообщ.
#7
,
|
|
|
Цитата J0ker @ Насколько я понимаю, нельзя его вызывать только в деструкторе... Хотя, честно говоря, за 3 года, пока я юзал MFC, ни разу DestroyWindow не пользовался. Предлагаеш удалить все все DestroyWindow? Варнинг первый исчез после добавления строкового ресурса в String table. Ищу причину второго варнинга. OK. Добавлено Второй варнинг (Warning: no message line prompt for ID 0xE001.) 0xE001->57345. Поиск по 57345 результатов не дал и в длл тожею Что делать? |
Сообщ.
#8
,
|
|
|
Цитата FockuSS @ Предлагаеш удалить все все DestroyWindow? Наоборот. Нужно его вызвать, когда окно стало не нужно. Подробности см. в MSDN - TN017 |
Сообщ.
#9
,
|
|
|
Цитата FockuSS @ Второй варнинг (Warning: no message line prompt for ID 0xE001.) 0xE001->57345. Поиск по 57345 результатов не дал и в длл тожею Что делать? Тогда не парься Судя по красоте ID, это какой-то стандартный |
Сообщ.
#10
,
|
|
|
Вот такое сообщение в отладке появилось.
Цитата 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 Нафига? И как обмениваться сообщениями тогда, чтоб не дергалась эта функция? |
Сообщ.
#11
,
|
|
|
Провел тест
В Главном окне добавил виртуальную функцию с вызовом далее по цепочке 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. |
Сообщ.
#12
,
|
|
|
https://www.codeproject.com/Questions/65145...s-main-applicat
Добавлено Тут еще можно почитать причины: http://rsdn.org/forum/tools/288243.all А так сложно сказать. Нужен номер варнинга. Так же нужно видеть как объявлен ресурс с номером 0x0098 |
Сообщ.
#13
,
|
|
|
Wound
Нету тут варнингов. И ресурс у меня не используется 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, то он в основном используется для получение Промта у контролов и так же в этой функции 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; } |
Сообщ.
#14
,
|
|
|
Ты смотришь АПИ функции MFC, а нужно смотреть свой код. Он у тебя ругается на контрол с ID 0x0098, переведи его в десятиричную систему и поищи по своим исходникам. Либо что это за ресурс с ID 0x0098 ?
Как он используется и где? Это не вот это вот случаем? ::PostMessageW(hwndApp, WORK_SCAN_ZERO, NULL, reinterpret_cast<LPARAM>(m_SelDev)); ? Добавлено Я пока не понимаю что у тебя происходит и где. Это не очевидно из того, что ты написал. Потому что ты просто написал про АПИшные MFC функции. Ну и ? Ну есть там такая проверка, и... что? |
Сообщ.
#15
,
|
|
|
Wound
Действительно, наложились два участка кода, мой и MFC |