thedeemon: (office)
[personal profile] thedeemon
Воистину, типобезопасность для багобоязненных!
Написал я недавно такое трехстишие:
ComboBox_AddString(combo, "Source Max");
ComboBox_AddString(combo, "Source Average");
ComboBox_AddString(combo, "Source Median");

Компилятор послушал его и принял без единого замечания. Но шайтан-машина вместо нужных строк изобразила такое:


Мне тут недавно некоторые советовали на WinAPI писать, и порой, в плагинах, этим таки приходится заниматься. Microsoft, милостивый, милосердный, послал страждущим заголовочный файл "Windowsx.h" с набором макросов вроде этого ComboBox_AddString, но если всякие винапишные функции чтут различение между юникодом и неюникодом, и компилятор не дает туда просто так отдать строку не в том формате, то эти макросы занимаются бесстыдными кастами, нисколько не заботясь о типах переданных значений. В результате тут ансишная строка была трактована как юникодная, английский текст стал китайским.

12. И те, кто не уверовал (в строгую типизацию), верующим говорят: "Вы следуйте по нашему пути, И понесем грехи мы ваши на себе!" Но ничего из их грехов они не понесут - Лжецы они, и только!
13. Нести им бремя собственных (грехов) И груз (грехов за совращение душ ближних), Что ляжет грузом на их груз. В День Релиза их спросят За (ложь всего) измышленного ими.
43. Вот притчи, что Мы людям предлагаем, Но внемлют им лишь те, кто сведущ.

Date: 2014-07-11 08:18 am (UTC)

Date: 2014-07-11 12:16 pm (UTC)
From: [identity profile] eeeeeeeeeeeeee.livejournal.com
Распостраненная ошибка: не поставить L (или _T - уже не помню) перед строкой.
А разве компилятор предупреждения не выдал?
Edited Date: 2014-07-11 12:19 pm (UTC)

Date: 2014-07-11 12:36 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
О чем и речь. Если вызывать какой-нибудь MessageBox со строкой без L, будет ругаться, а с этими вот макросами - даже ворнинга нет.

Date: 2014-07-11 01:29 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Зато в правильных языках вообще ничего про юникод не знают. Если язык не мешает UTF-8 байты хранить в Char - считай уже повезло.
Edited Date: 2014-07-11 01:29 pm (UTC)

Date: 2014-07-11 04:04 pm (UTC)
From: [identity profile] soonts.livejournal.com
«Microsoft, милостивый, милосердный, послал страждущим заголовочный файл "Windowsx.h" с набором макросов» — да, но это было 22 года назад, в Windows SDK 3.1.
Ты неправильно выбрал инструмент, на WinAPI с макросами в 2014-м году так себе идея.

Для тех задач, для которых 10-15 лет назад использовался чистый WinAPI, начиная года с 2005 следует использовать ATL+WTL.
Если бы ты его использовал, вызвал бы типобезопасный CComboBoxT::AddString.

В отличие от монструозного MFC, ATL+WTL очень лёгкая header-only обёртка над Win32 API, которая тем не менее сильно упрощает создание GUI.
Кстати там тоже навалом макросов — только макросы из ATL, в отличие от макросов из Windowsx.h, типобезопасность почему не ломают – попробуй передать в тот макрос значение не того типа и ничего не скомпилируется.

Date: 2014-07-11 04:40 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
MSDN ничего не знает про WTL, a ATL ничего не знает про комбобокс и другие контролы. Т.е. это не халяльное решение. Но наверняка более адекватное, тут ты прав.

Date: 2014-07-11 05:00 pm (UTC)
From: [identity profile] soonts.livejournal.com
>не халяльное решение
Халяльное.
WTL придумали в Microsoft, сделали в Microsoft, и он до сих пор поддерживается и развивается силами Microsoft.

Основная причина, почему оно не в SDK — для решения похожих задач уже есть MFC, несколько разных managed GUI библиотек, и новый C++/CX с XAML.
Поэтому Microsoft не очень понятно, зачем тратить много денег ещё и на WTL, это ж бизнес, а не благотворительность.

Date: 2014-07-11 05:26 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Ну, в данном случае (плагин для десктопного Win32 приложения с фиксированным API) managed и WinRT не годятся, а из оставшихся вариантов Священное Писание (MSDN) дает выбор лишь между MFC, просто WinAPI и этими вот макросами. Тащить MFC не охота, остается...

Про то как WTL поддерживается и развивается: пару месяцев назад выходило так, что последняя версия была 7 лет назад. В этом мае внезапно вышло обновление, неожиданность.
Edited Date: 2014-07-11 05:28 pm (UTC)

Date: 2014-07-11 05:50 pm (UTC)
From: [identity profile] soonts.livejournal.com
>пару месяцев назад выходило так, что последняя версия была 7 лет назад
В WTL очень мало кода и мало зависимостей. Например, вся реализация CComboBoxT — 360 строк.
Ты их даже скопипастить можешь к себе в проект, он зависит только от ATL, который конечно прекрасно поддерживается и документирован.

WinAPI пожалуй самый стабильный API в мире и давно перестал развиваться — шо там поддерживать? :-)

Date: 2014-07-11 04:44 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
А эти макросы и по сей день преподносятся как чуть ли не основное решение:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff485897(v=vs.85).aspx

И про ComboBox_AddString говорится
"Minimum supported client: Windows 2000 Professional" - свежачок. :)

Date: 2014-07-11 05:10 pm (UTC)
From: [identity profile] soonts.livejournal.com
Например статья "MessageBox function" тоже гласит, что Minimum supported client: Windows 2000 Professional
Неужто ты забыл, что оно прекрасно работало и на Win95, и на NT 3.51?

Просто Microsoft больше не поддерживает старые windows и старые SDK для них.
Некоторые редакции 2000 и XP ещё ограничено поддерживаются для некоторых клиентов MS, только это мешает им написать в MSDN для всего WinAPI "Minimum supported client: Windows 7".

Profile

thedeemon: (Default)
Dmitry Popov

February 2026

S M T W T F S
12 34567
891011121314
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 8th, 2026 06:34 am
Powered by Dreamwidth Studios