Проект Visual C ++, разработанный в Visual C ++ 2005 - В Visual C ++ 2010 утверждение отладки завершается неудачно при открытии меню, но режим выпуска работает, как это исправить? - PullRequest
0 голосов
/ 12 августа 2011

Я только начал работать над проектом, который был разработан в Visual C ++ 2005 с использованием MFC кем-то другим.Для этого я установил Visual C ++ 2010 - у меня нет опыта использования какой-либо версии (или вообще вообще Visual Studio).

В приложении есть строка меню, реализованная с использованием класса CMenu.и инициализируется из ресурса (т. е. создается с помощью редактора меню).

Если я запускаю приложение в режиме отладки, следующее утверждение отладки не выполняется, как только я открываю любое меню в строке меню:

Имя файла: afxwin1.inl

Утверждение (с соответствующим контекстом):



    _AFXWIN_INLINE HMENU CMenu::GetSafeHmenu() const
        { ASSERT(this == NULL || m_hMenu == NULL || ::IsMenu(m_hMenu));
            return this == NULL ? NULL : m_hMenu; }

Согласно отладчику, this установлен на указатель на мое меню,и this->m_hMenu также установлен на указатель - однако, отладчик, похоже, не понимает тип, значение равно 0xdeadbeef {unused=??? } (для более скучного значения 0xdeadbeef, конечно).

Казалось бы, что-то сломано, и, скорее всего, в коде проекта - я в курсе этого.Однако, если я создаю сборку релиза, она запускается без ошибок, и меню отображается правильно.Более того, я отредактировал меню с помощью редактора меню в Visual C ++ 2010 и сохранил его - изменений не было.Поэтому я исключаю проблемы совместимости меню из-за неправильного формата ресурса.

Я использую Windows XP SP3 на ThinkPad T61p.

Код, который создает меню



    CMenu menu;
    menu.LoadMenu(RESOURCE_NAME);
    SetMenu(&menu);

И работает в контексте подкласса CFrameWnd.

Я много искал в Google и совершенно уверен, что до этого никто не сталкивался с этой проблемой;Кроме того, я новичок во всех C ++, MFC и Visual Studio.Помощь будет очень ценится;Если я могу предоставить больше проблемных метаданных, пожалуйста, сообщите мне, и я сделаю это.Заранее спасибо!

1 Ответ

4 голосов
/ 12 августа 2011

Согласно MSDN (http://msdn.microsoft.com/en-us/library/177ay1x0.aspx)

CMenu :: LoadMenu () требует передачи параметра, которого нет в вашем примере кода. Проверьте это и убедитесь, что вы передаете действительный идентификатор ресурса меню.

Редактировать:

Ваш объект меню создан в стеке и будет уничтожен, как только он выйдет из области видимости. Откуда вы вызываете CWnd :: SetMenu? Вам нужно убедиться, чтосрок службы объекта может длиться до следующего CWnd :: SetMenu, иначе вы будете удерживать / ссылаться на висячий указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...