Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 1
Регистрация: 23.10.2011
Сообщений: 21

Нюансы в программном коде Win32 API

28.10.2011, 16:25. Показов 1353. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, господа профи!
Именно к Вам есть вопросы связанные в программированием в 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); - а вот тут непонятно зачем добавлен static_cast???? Для чего он сам я понимаю, но почему в ранних источниках литературы такого в примерах не наблюдается?
По строковым переменным:
в старых версиях - char szClassName[] = "MyClass";
в новых - static LPCTSTR szAppName = L"MyClass";
или еще такое - wchar_t или TCHAR szWindowClass
Так что из этого "разнообразия" более правильное? Борьба с такими "мелочами" занимает время и отвлекает от процесса изучения. В целом поправки в программах небольшие и сами программы все-таки начинают работать, но на поиск и борьбу с такими нюансами уходит время.
Уважаемые профи, можете ли Вы дать рекомендации относительно того на что следует обращать внимание при использовании ранних кодов программ? Какие изменения нужно внести в используемые типы данных? Потому, что иной раз приходится в настройках проекта отключать опцию использования unicode, но ведь он не красоты ради придуман и игнорировать его все равно нельзя.
Как следует подправить старый код, чтобы он нормально заработал в новых версиях?
Я не прошу по-принципу "сделайте за меня", больше чем уверен, что вы тоже сталкивались с подобным и исходя из своего опыта можете дать дельный совет.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2011, 16:25
Ответы с готовыми решениями:

Почему Microsoft больше не публикует книги по Win32 API? В частности, разработка графического интерфейса с Win32
Кто-нибудь знает, почему Microsoft перестала публиковать книги по программированию Win32 GUI? Я использую электронную книгу...

Очередь на основе динамического массива. Изучение функций ввода/вывода в программном интерфейсе Win32
изучение функций ввода/вывода в программном интерфейсе Win32. Интерфейс модуля для работы с заданной структурой данных из задания №4...

Ошибка в программном коде
Есть решение задачи, но при компиляции появляется ошибка в процедурах: procedure Form1.Edit1KeyPress ( Sender: TObject; var Key:char); ...

2
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
28.10.2011, 19:33
Отвечу на часть вопросов.
Помнится самому поначалу было тяжело привыкнуть, когда переходил с ANSI на UNICODE. А потом ничего, втянулся. По возможности стоит использовать функции модуля tchar.h - это позволит компилировать приложения как в ANSI, так и в UNICODE. Т.е. вы можете написать TCHAR szClassName[] = _T("MyClass"); и включать/отключать UNICODE - проект все равно скомпилируется и не придется ничего править. Эту же строку можно записать и так TCHAR* szClassName = _T("MyClass"), и так LPTSTR szClassName = _T("MyClass"). Если на третье (в данном случае) месте также присутствует символ "С" - значит стока является константой. Более подробно и понятно можно почитать у Румянцева в книге "Азбука программирования". Очень доступно описал все.
Далее. АТОМ, я так понимаю, используется в качестве результата работы функции по регистрации класса основного окна. Ну и шут с ним! Я никогда его не проверяю - процесс регистрации класса практически никогда не завершается с ошибкой. Главное, заполнить минимум необходимых полей структуры.
С приведением типа результата WinMain тоже все просто. Функция объявляется как int, а результат возвращается как dword. В принципе, транслятору все равно - все числовые типы в процессе предварительной обработки исходников приводятся к типу int (кроме, разумеется чисел с плавающей запятой), а если памяти не хватает - к unsigned int. А вы пытаетесь вернуть 32-битное значение с диапазоном 0...4294967295 из функции, которая возвращает значение в диапазоне –2147483648...2147483647. Чувствуете разницу? Поэтому компилятор и ругается...
0
2 / 2 / 1
Регистрация: 23.10.2011
Сообщений: 21
28.10.2011, 22:26  [ТС]
Большое спасибо, GrayWolf. Румянцева я читал, но другие книги "Азбука программирования" у меня тоже есть, но я увидел что речь там идет еще о Windows 95 и NT и не стал читать посчитав что уже устарело. Оказывается зря, даже бегло просматривая материал нахожу ответы на многие вопросы.
Еще раз спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2011, 22:26
Помогаю со студенческими работами здесь

Ошибка в программном коде
#include &lt;iostream.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; void treug(float a, float b, float c, int* p) { (*p)=0; if...

Ошибка в программном коде
var x,y:real; begin readln(x); y:=(sqrt(1/x)/(sqrt(abs(sin(x)-(3*cos)*(sqr(2*x)))))); writeln(y); end.

Ошибка в программном коде
Здравствуйте! помогите, пожалуйста, найти ошибку в программном коде. задание и код приложила

ошибка в программном коде.
Дано целое число N и набор из N положительных вещественных чисел. Вывести в том же порядке целые части всех чисел из данного набора (как...

Ошибка в программном коде
Подскажите пожалуйста что тут не так , где ошибка . Private Sub cmdrun_Click() Dim x As Single Dim e As Single Dim S As Single ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru