Что на самом деле делает флаг SEE_MASK_UNICODE в ShellExecuteEx?

Это перевод What does the SEE_MASK_UNICODE flag in ShellExecuteEx actually do? Автор: Реймонд Чен.

Кое-кто с невежливым ником хотел узнать, что делает флаг SEE_MASK_UNICODE.

А ничего он не делает.

Этот флаг был добавлен во время переноса Оболочки Windows 95 в Windows NT. Это случилось раньше, чем у меня есть доступ к базе данных исходников, но я могу предположить, как он был добавлен.

Одной из вещей, которые было необходимо сделать во время переноса, было создание Unicode-вариантов всех ANSI-функций, добавленных в Windows 95. Это можно было делать несколькими способами. Иногда создавали два варианта одной функции: с A и W суффиксами. Иногда это достигалось A и W вариантами одного интерфейса. Иногда это достигалось добавлением в запись флага, говорящего нужно ли использовать/трактовать данные как ANSI или как Unicode.

Я подозреваю, что изначально для Shell­Execute­Ex планировалось использовать третью модель (с флагом). Вероятно, потом разработчики изменили решение и вместо этого сделали A и W варианты самой записи SHELL­EXECUTE­INFO (SHELL­EXECUTE­INFOA и SHELL­EXECUTE­INFOW) и функции Shell­Execute­Ex (Shell­Execute­ExA и Shell­Execute­ExW). Но когда они переключились к другой модели, они оставили флаг нетронутым — вероятно, с целью убрать его позднее, когда будет исправлен весь код, который уже передаёт этот флаг. Однако эта задача так и не была выполнена.

Итак, сегодня этот флаг всё ещё находится в заголовочных файлах Windows, хотя на него никто не обращает внимания.

Читать на сайте автора.

Что за дела с сообщением EM_SETHILITE?

Это перевод What’s the deal with the EM_SETHILITE message? Автор: Реймонд Чен.

Если вы посмотрите на документацию по сообщениям EM_SETHILITE и EM_GETHILITE, то увидите просто «not implemented» («не реализовано»). Что тут происходит?

Сообщения EM_SETHILITE и EM_GETHILITE были добавлены в 2002 году для элемента управления «breadcrumb bar» (панель типа «хлебные крошки» aka «навигационная цепочка»). В те времена этот элемент управления был не таким, каким вы можете видеть его сегодня в Windows Vista (набор кнопок со стрелочками, каждая из которых представляет уровень иерархии). В 2002 году breadcrumb bar был просто несколько иначе выглядевшей строкой адреса (т.е. элементом управления edit). Вместо кнопки для каждого уровня в иерархии breadcrumb bar подсвечивал часть пути, когда вы наводили на неё мышью (или использовали клавиатуру для выделения). Вместо стрелочек с выпадающими меню breadcrumb bar ждал, пока вы наведёте на часть пути мышь, и автоматически показывал меню с дочерними элементами.

Потом дизайн breadcrumb bar изменился, а вариант с «просто немного иначе выглядящая строка адреса» был заброшен. Функциональность сообщений EM_SETHILITE и EM_GETHILITE была удалена, но номера сообщений остались зарезервированными — чтобы не сломать код, который уже начал отправлять эти сообщения (прим.пер.: речь идёт о коде Оболочке, внутреннем коде Microsoft). Конечно же, сообщения уже ничего не делают, но, по крайней мере, старый код компилируется и не отправляет случайно какое-то другое сообщение. Те, кто до сих пор продолжают использовать эти сообщения в своём коде, могут удалить их по собственному желанию.

Такова реальность разработки одновременно и библиотеки и клиентского приложения к ней. Если вы ответственны за библиотеку и хотите сделать в ней ключевое изменение (breaking change), то вам нужно делать его по частям, чтобы все клиентские приложения могли плавно совершить переход. Вы не можете просто пройтись по коду всех клиентов и исправить его — это не ваш код, у вас нет к нему доступа. Клиенты принадлежат другим командам разработчиков, а иногда — и другим компаниям. Вам нужно скоординироваться с этими разработчиками, сообщить им ваш план перехода, чтобы они могли продолжить использовать существующий код и выделить время на ваш план перехода.

Сообщения EM_SETHILITE и EM_GETHILITE — это просто остатки, которые так и не были вычищены. То, что сейчас находится в заголовочных файлах — это предпоследний шаг плана по переходу. Последним шагом этого плана было бы полное удаление этих сообщений из файлов заголовочников, но, к сожалению, конечный срок «больше не допускается изменение публичных заголовочных файлов» наступил раньше, чем успели сделать этот последний шаг — поэтому теперь эти сообщения продолжают находится в (публичном) заголовочном файле, и им придётся оставаться там вечно. Даже хотя они ничего не делают.

Читать на сайте автора.

Возможность-изгой: пристыковка папки к краю экрана

Это перевод Rogue feature: Docking a folder at the edge of the screen. Автор: Реймонд Чен.

Начиная с Windows 2000 и вплоть до Windows Vista вы могли перетащить папку из Проводника и бросить её на край экрана — как только вы отпускали папку, она пристыковывалась (dock) к краю экрана по аналогии с панелью (toolbar). Один клиент заметил, что это поведение больше не работает в Windows 7, и спросил: «Была ли эта возможность полностью удалена из Windows 7 или есть способ её включить обратно?»

Да, эта функциональность была удалена из Windows 7. Не существует способа её включить, поскольку код, который её реализует, был полностью удалён из продукта. Ну, хорошо, вы можете «включить» её с помощью вашего представителя поддержки, который отправит Design Change Request (запрос на изменение дизайна) с просьбой восстановить этот код в команду Windows Sustained Engineering. Но, я думаю что они будут злодейски смеяться, нажимая ОТКАЗАТЬ. Может быть, для пущего эффекта они даже добавят звуковой эффект.

Добавление этой функциональности произошло гораздо раньше, чем у меня есть возможность посмотреть в исходном коде Windows, поэтому я не могу объяснить как была введена эта возможность, но зато я могу предположить это (позже человек, который был ответственен за удаление этой функциональности, подтвердил мою догадку).

Во-первых, очень мало людей вообще использовали эту возможность. И среди тех, кто хотя бы раз использовал её, большинство делало это по ошибке и не знало, как вернуть всё обратно (звучит знакомо?). Так что эта возможность приносила больше проблем, чем пользы — и только из-за этого была хорошим кандидатом на удаление из продукта. Кроме того, команда дизайна была заинтересована в новом способе использования краёв экрана. Никто не знает, как эта функциональность была добавлена на самом деле. Мы сильно подозреваем, что она является ещё одной забытой нестандартной возможностью, добавленной разработчиком, который имел плохую привычку добавлять такие «фишки» в продукт.

Читать на сайте автора.