Проблема с MFC
Здравствуйте! Обращаюсь к людям, компитентным в вопросах программирования с помощью MFC. У меня такая проблема: при попытке получить указатель на наследника CWnd в обработчике сообщений с помощью метода GetDlgItem() происходит ошибка доступа (Access violation) в библиотеке MFC4X.dll. Но в некоторых других участках кода такие операции выполняются без ошибок. В чем дело? Млжет это происходить из-за компилятора или поврежденной библиотеки?
Такие вещи происходят чаще всего при неинициализированной памяти. Тщательно праверь указатели и hWnd на пример их инициализации. Действительно они то, что ты думаешь, в этом месте.
Дело в том, что я не могу получить указатель на объект-потомок CWnd. Ошибка возникает при вызове метода GetDlgItem(). Но я обнаружил интересный момент, который говорит не в пользу Visual C++: при запуске релиз-версии программы ошибки в том месте не возникает, тогда, как при запуске дебаг-версии, она проявляется. Что мне делать? Подскажите, пожалуйста!
Cкинь мне код на мыло, попробуем посмотреть.
Цитата:
On 2002-03-22 1922, artgonch wrote
Но я обнаружил интересный момент, который говорит не в пользу Visual C++ при запуске релиз-версии программы ошибки в том месте не возникает, тогда, как при запуске дебаг-версии, она проявляется. Что мне делать? Подскажите, пожалуйста!
Естественно в релизе не проверяются указатели на некорректность - этот момент говорит не в твою пользу... скорее всего элемент который ты хочешь получить уже не существует (если конечно вообще правильный ID указан)
Почему это должно говорить не в мою пользу? Ведь в релиз-версии элементы управления, на которые я получаю указатели, работают нориально! Ошибка возникает, когда я пытаюсь получить указатель на элемент управления. Я выяснил еще кое-что: оказывается, что функция ΑΣΣΕΡΤ() генерирует исключение, проверяя, является ли оконным дескриптором переданный ей дескриптор. Значит, по твоему получается, что главного окна уже не существует? Но ведь тот же код вставленный в другие обработчики работает нормально! А ΙD указан правильно - я это первым делом проверил. К тому же, даже если бы ID был неверен я бы получил в указателе на объект окна NULL, а получаю исключение.
Привет, это снова я. Хочу поделиться некоторыми соображениями по поводу своей же программы. Только что с небольшими переделками (в файле ресурсов) перенес ее в Borland C++ 5.02, и она заработала! Опять же, это не делает чести ни Visual C++, ни MFC, потому что в BC++ вместо MFC используется своя собственная биьлиотека (полностью совместимая с MFC на уровне заголовочных фалов, но, наверное, значительно лучше реализованная) BFC, причем, возможна статическая копмоновка с бинарным файлом. Так что теперь многих проблем можно избежать: я принесу в институт на занятие свой собранный проект, покажу его преподавателю (он, кстати, тоже недолюблтвает MS VC++ & MFC) и докажу, что программа на VC++ е работает, а моя - просто супер. Как вы думаете, прав ли я?
Вызывает ошибку вот это
char[20];
sprintf(s, InfoStr,
cv->GetCurrIndex() + 1,
cv->GetCount());
Где-то здесь чего-то нехорошего в стек перезаписывается. Почему скажу позже.
Да, кстати, в следующий раз неплохобы прислать файд .dsw (workspace), так как самому создавать проект и пихать в него все эти файлы не так здорово, и еще очень здорово было бы прислать файл с которым программа должна работать, а то пришлось самому разбираться, что за формат файла ей нужен и его создавать. Хорошо, что прога не сложная. Все это заняло не меньше времени, чем локализация ошибки.
Цитата:
...причем, возможна статическая копмоновка с бинарным файлом...
MFC тоже можно статично прилинковать
И все равно Borland C++ и BFC во сто крат лучше, чем VC++. Это уже давно ясно, но некоторые люди, которые никогда не видели ничего кроме MS-XX++, утверждают обратное. Тут в форуме недавно читал о достоинствах и недостатках BC и МС. Так вот, могу сказать с полной уверенностью, что C++ Builder компилирует проекты во много раз быстрее, и размер проекта не имеет значения.