Автор
|
Тема: Исключения...
|
Rambler |
опубликован 04-01-2002 10:00 MSK
Допустим есть указатель *pWnd на объект CWnd. Как узнать узнать существует ли окно? Потому что если окна уже нет, то попытка вызова любой функции путём pWnd->... убивает всю программу. А при проверке на существуемость m_hWnd, генерится какоето исключение, которое почему-то не перехватывается макросами TRY { .. if (pWnd->m_hWnd){} .. } CATCH_ALL(e) {..сюда не попадаем :((..} END_CATCH_ALL... а может это всё совсем неправильно? :(
|
migel
|
опубликован 04-01-2002 10:51 MSK
Во первых нужно пользовать GetSafeHwnd если указатель нуль то программа не вывалиться. а для отловки исключения PageFault нужноиспользовать SEH в MSVC код может быть таким: __try { // что то не хорошее } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) { return; } |
ADK
|
опубликован 04-01-2002 11:25 MSK
Если есть возможность, юзай HWND. CWnd* вообще часто временные и уничтожаются после обработки сообщения. Можешь проверять IsWindow(hwnd) (API) или ::IsWindow((HWND) m_yourWnd) (MFC). Только осторожнее: не напиши ::IsWindow((HWND) m_pyourWnd), где m_pyourWnd это CWnd*. Правильно: ::IsWindow((HWND) *m_pyourWnd) А так, конечно, нужно юзать GetSafeHandle() и проверять на нуль. |
Rambler
|
опубликован 04-01-2002 12:25 MSK
>Во первых нужно пользовать GetSafeHwnd если указатель нуль то программа не вывалиться. а для отловки исключения PageFault нужноиспользовать SEHДа.., но если окно было создано, а потом закрыто, то указатель не нуль. И при GetSafeHwnd() программа упадёт, и по-моему исключение Access Violation не сгенерится. Не знаю как поведёт себя в этом случае IsWindow((HWND) m_pyourWnd), или ,наверное, в данном случае IsWindow(pWnd->m_hWnd). |