вторник, 25 ноября 2008 г.

Почему Win32 отказывается загружать приложение, если функция в его секции импорта не может быть импортирована?

Это перевод Why does Win32 fail a module load if an import could not be resolved? Автор: Реймонд Чен.

Потому что мы пробовали другие варианты и они оказались много хуже.

В 16-битной Windows, модуль, у которого остались неразрешённые ссылки в импорте, мог успешно загрузиться. Вы были в порядке, пока вы не вызывали функцию из пропущенного импорта. Если же вы пытались вызвать функцию импорта, которая не была импортирована, то вы весьма красиво вылетали со страшным диалогом "Unrecoverable Application Error".

Ребята в Win32 решили, что это был не самый удачный дизайн, потому что часто люди могли брать программу Fred App, спроектированную для Windows 3.1, и запускать её под Windows 3.0, она могла великолепно работать в течении часа, а затем Fred App требовалась функция, которая была только в Windows 3.1 (например, GetSaveFileName) - и в результате программа вылетала.

Поэтому разработчики решили, что если одна функция не может быть импортирована, то всё приложение не должно загружаться. Если авторы Fred App хотели, чтобы оно всё же работало на Windows 3.0, то ничто не мешало им это сделать: они могли явно использовать GetProcAddress. Потому что если вам нужно явно вызвать какую-то функцию (GetProcAddress в нашем случае), то у вас должно щёлкнуть в голове: ага, здесь надо проверить возвращаемое значение.
Этот момент появляется, когда люди начинают кричать: "чёрт побери, должен быть какой-нибудь способ, чтобы я мог пометить вот эту импортируемую функцию как 'опциональную' - если её нельзя импортировать, то загрузка не должна останавливаться. Ответственность за проверку наличия функции перед её вызовом должна лежать на приложении!" Такие люди просто невольно просят историю повторить свои уроки.

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

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

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

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

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

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

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