При компиляции проекта компилятор ВДРУГ стал выдавать ошибку на вызове:
pDialog->Create((LPCTSTR)CMyDialog::IDD, this);
ругается на то, что в первом параметре Create он хочет видеть UINT, а LPCTSTR его ну никак не устраивает. Я попробовал скомпилять версии программы месячной и двухмесячной давности (храню полные неинкрементальные копии папки с проектом в отдельных ZIP-файлах) — та же фигня. Regardless to say что месяц назад они компилировались без проблем.
Если в вызове выше убрать (LPCTSTR), то проект компилируется, но при первом же вызове CDialog::Create в другом месте программы падает где-то в недрах MFC.
Что я мог сломать в VS?
Ни в какие настройки VS я осознанно не лазал, но последние несколько часов много говорил по телефону с клиентами и по факту я не помню, на какие кнопки я мог нажимать.
Почему падает, я так и не понял, прошелся отладчиком внутрь DoModal(), там вызывается PreModal()
и первой строкой этой функции стоит ASSERT(m_hWnd == NULL), на ней и падает. В чем причина — мне пока неясно.
Добавлено:
В общем как оказалось не нужно вызывать Create(), он теперь автоматов зовется из конструктора.
ТО есть меняем код на:
CMFCApplication1Dlg *dlg = new CMFCApplication1Dlg();
INT_PTR nResponse = dlg->DoModal();
И все прекрасно работает.
Судя по всему что-то наменяли в логике работы MFC и теперь для вызова DoModal() — не нужно звать Create()
Какого-то объяснения пока не обнаружил.
S>ругается на то, что в первом параметре Create он хочет видеть UINT, а LPCTSTR его ну никак не устраивает.
Не скажу за всю Одессу, но при переходе с VS 2013 на VS 2015 у меня тоже было пару "срабатываний" на ID'ах. Там по факту правильней было использовать не (LPCTSTR)IDD, а MAKEINTRESOURCE(IDD).
Но меня смущает в вашем коде то, что Вы делаете именно (LPCTSTR)CMyDialog::IDD. Там два Create:
Здравствуйте, Nikolaz, Вы писали:
N>Испокон веков вроде было всегда: pDialog->Create(CMyDialog::IDD, this); N>Зачeм здесь (LPCTSTR) ?
Это неважно. Вопрос состоит в том, что именно я мог сломать в VStudio так, что раньше такой код работал, а сейчас даже не компиляется?
Причем, как я уже писал, сломал я не проект, а именно среду, т.к. разные проекты, компилировавшиеся до того и хранящиеся в ZIPах, компилироваться теперь отказываются.
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>Судя по всему что-то наменяли в логике работы MFC и теперь для вызова DoModal() — не нужно звать Create() ES>Какого-то объяснения пока не обнаружил.
Что значит "поменяли"? Оно что, теперь обновляется через интернет независимо от желания разработчика? Типа — бах, обновление, и все проекты перестали компилироваться?
Здравствуйте, sushko, Вы писали:
S>Это неважно. Вопрос состоит в том, что именно я мог сломать в VStudio так, что раньше такой код работал, а сейчас даже не компиляется? S>Причем, как я уже писал, сломал я не проект, а именно среду, т.к. разные проекты, компилировавшиеся до того и хранящиеся в ZIPах, компилироваться теперь отказываются.
Студия поставила апдейт какой?
Выбрал другую версию Platform SDK?
Сложно сказать что еще могло повлиять на все проекты сразу.
Здравствуйте, sushko, Вы писали:
bnk>>Студия поставила апдейт какой?
S>Не знаю, но IE вдруг повел себя по-другому. Наверное, обновился, собака.
Посмотри, что недавно ставилось в обновлениях. Можно попробовать откатиться на состояние "до".
bnk>>Выбрал другую версию Platform SDK?
S>А где я мог это сделать?
Запустить Windows SDK Configuration Tool и выбрать другую версию SDK?
Здравствуйте, sushko, Вы писали:
S>Что значит "поменяли"? Оно что, теперь обновляется через интернет независимо от желания разработчика? Типа — бах, обновление, и все проекты перестали компилироваться?
Вот тут ХЗ. Скорее всего версия SDK поменялась где-то и теперь не хочет компилироваться.
В проектах MFC в файле stfafx.h есть такой инклуд — targetver.h, в котором автоматически определяется версия SDK и компилятора
Можно попробовать вручную ставить нужные значения.
// Включение SDKDDKVer.h обеспечивает определение самой последней доступной платформы Windows.
// Если требуется выполнить сборку приложения для предыдущей версии Windows, включите WinSDKVer.h и
// задайте для макроопределения _WIN32_WINNT значение поддерживаемой платформы перед вхождением SDKDDKVer.h.
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>Вот тут ХЗ. Скорее всего версия SDK поменялась где-то и теперь не хочет компилироваться.
Уже теплее. Я же говорю, что у меня тоже с какого времени стало ругаться на функции из Win API,
которые работают с ресурсами. помогло использоавание MAKEINTRESOURCE() вместо (LPCTSTR).
А MAKEINTRESOURCE(), как известно, лежит в Platform SDK.
Я это заметил при переходе на Visual Studio 2015. Наверняка SDK тоже обновился.
Докладываю: выполнил переустановку VStudio — не помогло. Снес VStudio, заново ее установил — помогло, теперь проекты компилируются. Специально проверил: вчера — после возникновения проблемы — в файле afxwin.h у класса CDialog был только метод
Здравствуйте, sushko, Вы писали:
S>Докладываю: выполнил переустановку VStudio — не помогло. Снес VStudio, заново ее установил — помогло, теперь проекты компилируются.
Так какая версия VStudio всё-таки? Не сообщите нам?
На само сообщение об ошибке от компилятора ещё бы глянуть
Переустановка — это наверное что-то вроде Upgrade/Refresh? Тогда, последние обновления, которые были у VStudio никак наверное не были затронуты.
Заново — это снести и поставить некую версию без её актуальных обновлений. Из этого вывод — ждите проблем опять . Студия в тихую что-нибудь обновить и будет то же самое.
S>теперь, после удаления и установки VStudio, появился еще и метод S>
Здравствуйте, Nikolaz, Вы писали:
S>>Докладываю: выполнил переустановку VStudio — не помогло. Снес VStudio, заново ее установил — помогло, теперь проекты компилируются. N>Так какая версия VStudio всё-таки? Не сообщите нам?
2010
N>На само сообщение об ошибке от компилятора ещё бы глянуть
Cannot convert LPCTSTR to UINT или что-то в этом духе. Дословно уже не приведу, т.к. все исправилось.
N>Переустановка — это наверное что-то вроде Upgrade/Refresh? Тогда, последние обновления, которые были у VStudio никак наверное не были затронуты. N>Заново — это снести и поставить некую версию без её актуальных обновлений. Из этого вывод — ждите проблем опять . Студия в тихую что-нибудь обновить и будет то же самое.
Будут бить — будем плакать.
S>>теперь, после удаления и установки VStudio, появился еще и метод S>>
Рррр. Я говорю, что когда я вчера вечером смотрел именно эти строки именно в этом файле, то этого метода в этой строке там не было. Настолько не было, что я по приколу попробовал даже сам его туда добавить. После добавления оно скомпилялось, но при исполнении программы падало при создании первого же диалогового окна.
Попробовать создать новый dialog based application и посмотреть, что из этого выйдет, не догадался
Здравствуйте, sushko, Вы писали:
N>>Так какая версия VStudio всё-таки? Не сообщите нам? S>2010
Старовата однако ...
S>Рррр. Я говорю, что когда я вчера вечером смотрел именно эти строки именно в этом файле,
Может там какой MFC Extention Pack "влез" ?
2010 версия — вроде как раз тогда вышло MFC Ext на базе кода от BCGControlBar
Здравствуйте, Nikolaz, Вы писали:
N>Здравствуйте, sushko, Вы писали:
S>>Рррр. Я говорю, что когда я вчера вечером смотрел именно эти строки именно в этом файле, N>Может там какой MFC Extention Pack "влез" ? N>2010 версия — вроде как раз тогда вышло MFC Ext на базе кода от BCGControlBar
Появилось для MSVC-2008 в составе SP1: http://ntcoder.com/bab/tutorial_mfc_feature_pack1_part1
Всё описанное — скорее всего результат апдейта, который M$ делает "тихой сапой".
В общем — любят мелкомягкие "радовать" юзера
P.S. От MSVC-2010, ИМХО, надо было давно уйти. Это самая глючная студия, с которой я когда-либо работал. Уже лучше сидеть на MSVC-2008.
Здравствуйте, sushko, Вы писали:
S>Не настолько, чтобы платить за упгрейд
Community Edition вроде как достаточно "бесплатна":
For individuals:
Any individual developer can use Visual Studio Community to create their own free or paid apps.
For organizations:
An unlimited number of users within an organization can use Visual Studio Community for the following scenarios: in a classroom learning environment, for academic research, or for contributing to open source projects.
For all other usage scenarios:
In non-enterprise organizations, up to five users can use Visual Studio Community.
In enterprise organizations (meaning those with >250 PCs or >$1 Million US Dollars in annual revenue), no use is permitted beyond the open source, academic research, and classroom learning environment scenarios described above.