Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 01:01   #1
voyager2011
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию Нюансы в программном коде Win32 API

Здравствуйте, господа профи!
Именно к Вам есть вопросы связанные в программированием в C++ для Win32.
Программированием занимаюсь давно, в основном на Visual Basic и Visual Foxpro. С Visual C++ сначала не подружился, теперь решил восполнить этот пробел. Дело в том, что я занимаюсь еще и 3D-графикой и решил заняться программированием применительно к ней. Для работы выбрал MS VS 2005. Не спрашивайте почему. Так вот знакомство с C++ на уровне простых консольных программ прошло более-менее нормально, но когда добрался до Win32 API начались проблемы, в частности с отличием типов данных в старых версиях и с unicode.
Объясните пожалуйста следующие моменты:
Насколько необходимо использовать ATOM? Я понимаю, что он проверяет не создавалась ли копия приложения, но в более ранних версиях обходились без него, мастер проекта генерит эти строки, а в новой литературе в примерах ATOM часто не используют. Почему? Пишут "по-старинке" или ATOM не обязателен.
Часто возникают проблемы (особенно со старыми примерами программ написанных даже еще по MS VS 6) с использованием строковых переменных, так называемые "широкие" символы. Зачастую решается добавлением ключа L перед строкой, но в некоторых местах программы это не помогает, приходится методом тыка подбирать или unicode отключать чтобы заработало.
Еще непонятен момент с возвратом значений из процедуры WinMain:
return msg.wParam; - компилятор выдает предупреждение о несоответствии типов данных и возможной потере данных;
Мастер создания проекта генерит:
return (int) msg.wParam; - ну здесь вроде все ясно с приведением типов, но почему в старой литературе этого нет? В ранних версиях компиляторам все равно было какое значение возвращается????
В более новой литературе приводится такое:
return static_cast<int>(msg.wParam); - а вот тут непонятно зачем приводится к статическому типу???? Для чего сохраняется в памяти возвращаемое значение???? В ранних источниках литературы такого в примерах не наблюдается.
По строковым переменным:
в старых версиях - char szClassName[] = "MyClass";
в новых - static LPCTSTR szAppName = L"MyClass";
или еще такое - TCHAR szWindowClass
Так что из этого более правильное? Борьба с такими "мелочами" занимает время и отвлекает от процесса изучения. В целом поправки в программах небольшие и сами программы все-таки начинают работать, но на поиск и борьбу с такими нюансами уходит время.
Уважаемые профи, можете ли Вы дать рекомендации относительно того на что следует обращать внимание при использовании ранних кодов программ? Какие изменения нужно внести в используемые типы данных? Потому, что иной раз приходится в настройках проекта отключать опцию использования unicode, но ведь он не красоты ради придуман и игнорировать его все равно нельзя.
Как следует подправить старый код чтобы он нормально заработал в новых версиях.
Спасибо.
voyager2011 вне форума Ответить с цитированием
Старый 28.10.2011, 09:50   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от voyager2011 Посмотреть сообщение
Для работы выбрал MS VS 2005.
Очень зря ! Сейчас доступна MS VS 2010 бесплатная версия, которая частично поддерживает новый стандарт C++0x.
Цитата:
Сообщение от voyager2011 Посмотреть сообщение
Насколько необходимо использовать ATOM? Я понимаю, что он проверяет не создавалась ли копия приложения, но в более ранних версиях обходились без него, мастер проекта генерит эти строки, а в новой литературе в примерах ATOM часто не используют. Почему? Пишут "по-старинке" или ATOM не обязателен.
Это тип данных представляющий короткое беззнаковое целое и эквивалентен WORD
Цитата:
Сообщение от voyager2011 Посмотреть сообщение
return static_cast<int>(msg.wParam); - а вот тут непонятно зачем приводится к статическому типу???? Для чего сохраняется в памяти возвращаемое значение???? В ранних источниках литературы такого в примерах не наблюдается.
Оно не сохраняется ! Это более корректное приведение типов в стиле C++.
Цитата:
Сообщение от voyager2011 Посмотреть сообщение
По строковым переменным:
в старых версиях - char szClassName[] = "MyClass";
в новых - static LPCTSTR szAppName = L"MyClass";
или еще такое - TCHAR szWindowClass
Так что из этого более правильное?
Смотря, что используется в программе. char или wchar_t (юникод). TCHAR - "полиморфный" тип, что в данном случае будет использоваться char или wchar_t зависит от настроек проекта.
An1ka вне форума Ответить с цитированием
Старый 28.10.2011, 11:04   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
return static_cast<int>(msg.wParam); - а вот тут непонятно зачем приводится к статическому типу????
Открывайте книжку, не к статитескому типу, а статичесчкие (т.е. на этапе компиляции) приводится
p51x вне форума Ответить с цитированием
Старый 28.10.2011, 16:05   #4
voyager2011
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
Радость

Цитата:
Сообщение от p51x Посмотреть сообщение
Открывайте книжку, не к статитескому типу, а статичесчкие (т.е. на этапе компиляции) приводится
Спасибо. Да действительно, я несколько не внимателен и забыл, что такое на самом деле static_cast. Теперь все становится ясно.
voyager2011 вне форума Ответить с цитированием
Старый 28.10.2011, 16:08   #5
voyager2011
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
Очень зря ! Сейчас доступна MS VS 2010 бесплатная версия, которая частично поддерживает новый стандарт C++0x.

Это тип данных представляющий короткое беззнаковое целое и эквивалентен WORD
Оно не сохраняется ! Это более корректное приведение типов в стиле C++.

Смотря, что используется в программе. char или wchar_t (юникод). TCHAR - "полиморфный" тип, что в данном случае будет использоваться char или wchar_t зависит от настроек проекта.
Спасибо. Вот наконец-то начинает проясняться. Попробовал в одном из примеров где на char'e заминка была, сменил на wchar_t и заработало нормально. В целом уже вырисовывается картина "как старое на новое адаптировать". Попробую с другими примерами
voyager2011 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программном коде что делать! LLWIS C++ Builder 9 23.08.2011 18:56
win32 API.Visual Studio 2008.Создание проекта Win32 Aleksandr_Yanov Visual C++ 2 12.09.2010 13:09
Обьясните что делают и означают пару строк в программном коде! FreeZeT Общие вопросы C/C++ 2 15.06.2010 03:20
Не могу разобраться в программном коде knight190 Помощь студентам 0 12.06.2010 12:27
Вопрос *где в программном коде реализуется следующая операция... Roman Charming Общие вопросы Delphi 4 19.06.2009 06:58