пятница, 27 августа 2010 г.

Если InitCommonControls ничего не делает - зачем же мне её вызывать?

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

Одной из проблем, с которыми встречаются новички, когда они начинают использовать общие элементы управления оболочки (shell common controls), является забывание про вызов функции InitCommonControls. Но если вы дизассемблеризируете саму функцию InitCommonControls, то вы увидите, что она, как и функция FlushInstructionCache, ничего не делает.

Тогда зачем вам её вызывать?

Как и с FlushInstructionCache, здесь важно, не то, что делает функция, а важен просто сам факт, что вы её вызываете.

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

Без функции InitCommonControls, программа, которая хочет использовать библиотеку общих элементов управления оболочки, могла бы не иметь ссылки на библиотеку COMCTL32.DLL в своей таблице импорта. Это означает, что когда программа запускается, то COMCTL32.DLL не загружается и, поэтому, не инициализируется. Что означает, что она не регистрирует свои оконные классы. Что, в свою очередь, означает, что ваш вызов CreateWindow завершится неудачно, потому что оконный класс не был зарегистрирован.

Вот почему вам нужно вызывать функцию, которая ничего не делает. Это для вашего же блага.

(Конечно же, теперь есть новая функция InitCommonControlsEx, которая позволяет вам указать классы, которые вы хотели бы зарегистрировать. При загрузке COMCTL32.DLL регистрируются только классические классы из Windows 95 - для всего остального вам нужно попросить загрузку отдельно).

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.