CPropertyPage *m_Pages[];
CTabCtrl m_Tabs;
int m_iLastPage=-1;
...
void CMyDlg::OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult) {
if (m_LastPage != -1) m_Pages[m_iLastPage]->ShowWindow(SW_HIDE);
int c = m_Tabs.GetCurSel();
m_Pages[c]->ShowWindow(SW_SHOW);
m_Pages[c]->UpdateWindow();
m_iLastPage = c;
*pResult = 0;
}
ОБРАТНАЯ СВЯЗЬ
Еще письмо на тему отказа работать release-версии программы. И прошу не ворчать, потому что когда сами с такой проблемой встретитесь (скорее всего, когда программу показывать нужно уже через несколько дней), скажете этому человеку спасибо!
Сам недавно столкнулся с "проблемой Release билда". Естественно, 95% всех подобных багов – это баги с памятью. Проблемы с NULL указателями ещё менее-более отслеживаются, а вот с "перетиранием" памяти – сложнее.
Я решил эту проблему с помощью _CrtCheckMemory(). Вообще, в Windows есть минимальный набор механизмов для отладки, они все описаны в MSDN 'Debug Routines'.
Т.е. сначала определяем с помощью внутреннего логгинга примерное место вылета проги – это нужно делать не в Debug build (там-то всё работает :), а в Release. Простой лог можно за полчаса набросать. Если прога не использует DirectX или OGL, то можно (наверное), использовать даже MessageBox. Главное – локализовать место появление бага. Надо сразу заметить, что, как правило, место, где прога вылетает, совсем не то же самое место, где есть баг. В моём случае баг был в инициализации, а валилась функция уже во время работы. Потом работаем с помощью assert(_CrtCheckMemory()); уже в Debug build, где есть дебаггер и всё такое.
Если программа менее-более линейна и не сильно здоровая, то можно вставить assert( _CrtCheckMemory()); прямо по ходу выполнения, перед и после каждого подозрительного вызова. Он сработает, как только обнаружит поврежденный heap – мы сразу можем видеть где это происходит, и делать выводы. Надеюсь это хоть кому то поможет.
Иван Невраев
Ну вот и все на сегодня. До новых встреч и будьте здоровы!
©Алекс Jenter mailto:jenter@mail.ru Красноярск, 2000.
Программирование на Visual C++
Выпуск №14 от 14 сентября 2000 г.
Приветствую вас!
Выпуск чуть-чуть задержался, в основном из-за суеты этих сентябрьских дней. Но, надеюсь, что вы еще не успели заскучать.
ОБРАТНАЯ СВЯЗЬ
Предлагаю вашему вниманию интересное письмо, пришедшее пока я был в отпуске. В нем затрагивается очень больная тема для всех MFC-программистов:
Я только что подписался на Вашу рассылку и прочитал весь архив. В первую очередь хочу присоединиться ко всеобщим поздравлениям (хоть и с нескольким опозданием) и поблагодарить Вас за то что принялись за столь нелегкий и, насколько я понимаю, практически бесприбыльный труд. Так уж получилось, что в этой области работает очень много профессионалов и любителей, поэтому вопросов накопилось очень много. Я крайне рекомендую Вам почаще направлять вопрошающих на microsoft.public.ru.vc и microsoft.public.ru.russian.programming, где подобные вещи более уместны. Хоть это и самые активные русскоязычные конференции на тему, но они недотягивают то своих западных конкурентов, поэтому свежая кровь им явно не повредит.
[…] К делу: Может я и ошибаюсь, но насколько я знаком с психологией Microsoft, можно судить, что MFC доживает свои последние дни. Она морально устарела, скорее всего эта библиотека уйдет в небытие "оставлено для совместимости" уже со следующей версией VS. Я очень хочу, чтобы Вы в своей рассылке обратили внимание на WTL (Windows Template Library) – это библиотека шаблонов похожая на ATL, способная частично (или полностью) заменить MFC. Она входит в Platform SDK начиная с Jan'2000. Пока это пробный камень, поэтому практически недокументирована. Microsoft не слишком афиширует ее появление, и те немногие программисты, которые ее используют, вынуждены разбираться во всем самостоятельно. А выгод при ее использовании очень много. Например она значительно дружественнее к WinAPI, который активно рассматривается в рассылке, чем MFC. Возможно с выходом следующей версии VS WTL будет дополнена или даже изменена и выставлена как основное средство разработки приложений в VC, так как больше отвечает предназначению C++ – созданию компактных, быстрых и эффективных приложений. Именно по этим причинам я считаю очень полезным рассмотреть эту библиотеку в рассылке, а в будущем, возможно, уделить ей больше внимания чем MFC.
Ярослав Говорунов
Итак, есть два вопроса. Вопрос первый – что будет с MFC в будущем? Вопрос второй : что это еще за зверь – WTL?
На первый этих двух вопросов не существует однозначного ответа. Если я разверну дискуссию на эту тему в рассылке, то наверное вы не скоро дождетесь ее окончания, настолько это острый вопрос. Скорую смерть MFC предсказывали не раз и не два, но почему-то эта смерть все никак не наступит. Даже наоборот, сейчас трудно найти объявление о найме программиста на C++ под Windows, где не требовалось бы знание MFC (и чаще всего еще и ActiveX/COM). Работодатели задают тон, и поэтому MFC и сейчас так же популярен, несмотря на всю свою нелогичность, неудобство, малонадежность и множество других недостатков. Наверное, пока что его доствоиства (а они, надо признать, все-таки есть) плюс усилия всемогущей Microsoft по его поддержке перевешивают. Да и в обозримом будущем, скорее всего, ситуация мало изменится – в следующую версию Visual Studio (о которой я писал в выпуске №8) MFC, вне всякого сомнения, войдет. Будет ли это в виде "оставлено для совместимости"? Я думаю, вряд ли. MFC cлишком уж широко используемая библиотека. Хотя это, конечно, не более чем мое личное мнение.
Читать дальше