понедельник, 9 сентября 2019 г.

Суеверие: почему старожилы предпочитают GetFileAttributes для проверки существования файла?

Это перевод Superstition: Why is GetFileAttributes the way old-timers test file existence? Автор: Реймонд Чен.

Если вы спросите старого пердуна: "Как проверить наличие файла?", он наверняка ответит: "Используй GetFileAttributes". Это и сегодня, вероятно, самый быстрый способ проверки существования файла, поскольку он требует только одного вызова. Другие методы (такие как FindFirstFile или CreateFile) требуют дополнительного вызова FindClose или CloseHandle - что приведёт к дополнительным запросам по сети, увеличивая стоимость проверки.

Но в прежние времена выбор GetFileAttributes был не просто оптимизацией производительности. Если вместо этого вы попытаетесь открыть файл для проверки его существования, вы можете и вовсе получить неправильный ответ!

четверг, 5 сентября 2019 г.

Что такое __wchar_t (с двумя ведущими подчёркиваниями) и почему у меня вылезают связанные с ним ошибки?

Это перевод What is __wchar_t (with the leading double underscores) and why am I getting errors about it? Автор: Реймонд Чен.

Компилятор Microsoft Visual C++ имеет параметр компилятора с названием /Zc:wchar_t, который позволяет вам контролировать, что же означает тип wchar_t.

Согласно стандарту C++, wchar_t - это отдельный родной (встроенный, нативный) тип, и именно так по умолчанию считает компилятор Visual C++. Тем не менее, вы можете передать /Zc:wchar_t-, и это отключит встроенное определение типа wchar_t, позволяя вам определить тип так, как вам нравится. А для Windows это исторически означает:
typedef unsigned short wchar_t;
потому что Windows предшествует версиям стандартов C и C++, которые представили wchar_t как собственный тип.

Так что теперь у вас есть проблема, если вы пишете библиотеку, которая будет использоваться как кодом старой школы, написанным с wchar_t, определённым как псевдоним для unsigned short, так и кодом новой школы, написанным с wchar_t как отдельным внутренним типом. Какой тип данных вам нужно использовать для строковых параметров?

Печальная история спецификаторов форматирования в стиле printf в Visual C++

Это перевод The sad history of Unicode printf-style format specifiers in Visual C++. Автор: Реймонд Чен.

Windows реализовала Unicode раньше, чем большинство других операционных систем. В результате решения Windows для многих проблем отличаются от решений, принятых теми, кто подождал, когда пыль осядет¹. Самым ярким примером этого является использование Windows UCS-2 в качестве кодировки Unicode. Тогда это была кодировка, рекомендованная консорциумом Unicode, потому что Unicode 1.0 поддерживал только 65'536 символов². Консорциум Unicode передумал пять лет спустя, но к тому времени было уже слишком поздно для Windows, которая уже выпустила Win32s, Windows NT 3.1, Windows NT 3.5, Windows NT 3.51 и Windows 95 - все из которых использовали UCS-2³.

Но сегодня мы поговорим о строках формата в стиле printf.

Обновлено: Если FlushInstructionCache ничего не делает, почему я должен её вызывать?

Это перевод If FlushInstructionCache doesn’t do anything, why do you have to call it, revisited. Автор: Реймонд Чен.

Предполагается, что вы будете вызывать функцию FlushInstructionCache, когда вы генерируете или модифицируете исполняемый код в run-time - чтобы процессор при выполнении вашего сгенерированного/модифицированного кода читал бы написанные вами инструкции, а не старые инструкции, которые могут остаться в кеше команд процессора.

Ранее мы узнали, что в Windows 95 функция FlushInstructionCache не делает ничего, кроме возврата. Это потому, что простого вызова функции было достаточно, чтобы очистить кэш команд.

Но в Windows NT функция FlushInstructionCache выполняет реальную работу, поскольку ей необходимо уведомить все остальные процессоры о необходимости очищать их кэши.

Однако если вы посмотрите на Windows 10, то вы обнаружите, что функция FlushInstructionCache выглядит как версия для Windows 95: она ничего не делает.

В чём тут дело?

среда, 31 июля 2019 г.

А как насчет USERSEEUSERDO и GDISEEGDIDO?

Это перевод What about USERSEEUSERDO and GDISEEGDIDO? Автор: Реймонд Чен.

В Windows 3.1 существуют недокументированные функции с именами USERSEEUSERDO ("пользователь видит - пользователь делает") и GDISEEGDIDO ("GDI видит - GDI делает"). Наверное, и за этими забавными именами тоже стоит какая-то история?

пятница, 26 июля 2019 г.

Когда вам просто необходимо отправить что-то вовремя на презентацию продукта

Это перевод When it absolutely, positively has to be there for the product demo overnight. Автор: Реймонд Чен.

Подготовка к запуску Windows NT включала приобретение впечатляющего оборудования для демонстрации масштабируемости операционной системы.

вторник, 23 июля 2019 г.

Какое было кодовое имя у Windows 7?

Это перевод What was the code name for Windows 7? Автор: Реймонд Чен.

Интернет подсказывает, что у Windows 7 было кодовое имя (codename) Blackcomb. Это не совсем правильно.

четверг, 27 июня 2019 г.

Почему функция GetVersion сообщает основную версию в младшем байте и младшую версию в старшем байте?

Это перевод Why does the Get­Version function report the major version in the low-order byte, and the minor version in the high-order byte? Автор: Реймонд Чен.

Лора Батлер задаёт вопрос: кому в голову пришла идея возвращать основную (major) версию в младшем байте, а младшую (minor) версию - в старшем байте функции GetVersion. Надо же делать наоборот: нужно возвращать основную версию в старшем байте и младшую версию в младшем байте, чтобы вы могли делать такое:
if ГипотетическаяУлучшеннаяGetVersion >= $030A then
begin
  // версия минимум 3.10
end;
Вместо этого сейчас основная версия возвращается в младшем байте, а младшая версия - в старшем байте, поэтому версия 3.10 возвращается как значение $0A03, что приводит к таким ошибкам:
if GetVersion >= $0A03 then
begin
  // неверная проверка на версию ≥ 3.10
end;
Почему номер версии возвращается таким странным образом?

вторник, 25 июня 2019 г.

Почему Windows for Workgroups называют Windows для складов?

Это перевод Why was Windows for Workgroups pejoratively nicknamed Windows for Warehouses? Автор: Реймонд Чен.

Первой версией Windows со встроенной поддержкой сети была Windows for Workgroups 3.10. Её целевой аудиторией были малые предприятия, которые хотели бы объединить свои компьютеры вместе - в так называемые "рабочие группы" (workgroups). Этот термин сохраняется и в Windows NT и относится к неуправляемой совокупности компьютеров, работающих в одноранговом режиме.

среда, 19 июня 2019 г.

Что такое WofCompressedData?

Это перевод What is WofCompressedData? Does WOF mean that Windows is a dog? Автор: Реймонд Чен.

При выполнении анализа производительности своей программы клиент обнаружил, что в программе происходят чтения из альтернативного потока данных с названием WofCompressedData. Если вы поищите упоминания «WofCompressedData» в Интернете, то в основном найдёте вопросы о том, что это такое. В ответах кто-то высказывает предположение, что это вредоносное ПО, а кто-то подозревает (или даже уверенно заявляет), что это артефакт антивирусного программного обеспечения, и его можно удалить.

Что же такое WofCompressedData?