О Windows из первых рук: Таинственный ключ

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

Раймонд Чен

«Почему система так странно себя ведет, когда я модифицирую этот недокументированный ключ реестра?» Это один из вопросов, который вы никогда не хотели бы услышать.

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

«Если сначала ключ имеет значение 0 и я вручную устанавливаю ему значение 1, то когда я захожу в панель управления, я вижу, что флажок установлен, однако система ведет себя так, как будто он по-прежнему сброшен. Еще более странно то, что если я пытаюсь изменить состояние флажка в панели управления, это не удается сделать. Он просто остается установленным. Был бы признателен за помощь».

Иногда люди сбиваются на описание проблемы и забывают задать вопрос. В данном случае клиент описал все, что он сделал и увидел. Однако он, в сущности, не сказал, какая помощь ему нужна. Разработчик, прочитавший это, наверное, сказал бы «Это логично» или «Мда, интересная история».

Предположим, что вопрос был таким: «Не могли бы вы помочь разработать программу, управляющую этим флажком? Похоже, что редактирование реестра не работает».

Ничего не меняйте

Начнем с того, что ключ реестра, о котором идет речь, недокументирован по следующей причине: его прямая модификация не поддерживается. Прямая модификация приводит к рассинхронизации внутренних состояний. Поэтому и возникает непонятное поведение, подобное описанному клиентом.

Рассмотрим воображаемый ресторан. У этого ресторана имеется основная копия ежедневного меню кухни. В начале дня все официанты и повара смотрят меню и фиксируют его в своей памяти. Иногда шеф-повар вносит изменения в меню в течение дня. В этом случае он говорит об этом всем сотрудникам, чтобы они знали о них и учитывали их в своей работе. «У нас кончился палтус, поэтому я вычеркиваю палтус до конца дня». В результате официанты не будут предлагать блюда, которых нет в ресторане.

Это меню подобно реестру. Предположим, что клиент проберется на кухню, возьмет ручку, вычеркнет филе-миньон и допишет стейк по-нью-йоркски. (Может быть, он еще и изменит цену с $45 на $35.)

Официант скажет ему: «Извините, сэр, но у нас сегодня нет стейка по-нью-йоркски. Могу я предложить вам филе-миньон?».

Тогда клиент ответит ему: «Вы неправы. Сегодня у вас есть стейк по-нью-йорски. Вернитесь на кухню и взгляните на основное меню. Вы увидите, что он там есть. Очевидно, у вас в ресторане не все в порядке с выучкой сотрудников».

Основное меню на кухне не документировано. Откуда клиент может узнать о существовании основного меню? Внесение изменений в основное меню клиентом — совершенно не поддерживаемое поведение. То, что вы вычеркнули филе-миньон и дописали стейк по-нью-йоркски, не означает, что стейк по-нью-йоркски возьмет и появится на кухне.

Официант даже не видел внесенное клиентом изменение, поскольку он запомнил меню в начале дня и с тех пор не смотрел на основное меню. В этом не было нужды, поскольку шеф-повар не объявлял об изменениях в меню. Такого клиента следует вышвырнуть из ресторана и запретить ему возвращаться.

Пожалуй, сотрудники группы, отвечающей за совместимость приложений, прочитают это и воскликнут: «Эх, как же нам хотелось бы, чтобы эту последнюю часть аналогии перенесли на ПО!». Некоторые параметры не предназначены для изменения и настройки. Иногда лучше просто ничего не трогать.

Раймонд Чен

Раймонд Чен (Raymond Chen) — его веб-сайт и одноименная книга «Old New Thing», вышедшая в издательстве Addison-Wesley в 2007 году, рассказывают об истории Windows, программировании с использованием интерфейса Win32 и выпрашивании сладостей.