Точки входа библиотеки DLL

Для каждой создаваемой DLL вы сможете указать точку входа пуска библиотеки, которая обычно автоматом вызывается при каждом подключении либо выключении процесса. В то же время, в функции LoadLibraryEx предусмотрена функция, позволяющая подавить вызов точки входа. В случае неявно связываемых (связываемых во время выполнения) библиотек DLL подключение и отключение процесса происходит, соответственно Точки входа библиотеки DLL, при его запуске и окончании. В случае же очевидно связываемых DLL это осуществляется при вызове функций LoadLibrary, LoadLibraryEx и FreeLibrary.

Не считая того, точка входа вызывается каждый раз, когда процесс делает новый поток (глава 7) либо прекращает его выполнение.

Точкой входа с именованием DllMain, макет которой приводится ниже, мы воспользуемся полностью Точки входа библиотеки DLL исключительно в главе 12 (программка 12.4), где она предоставит потокам удачный метод управления ресурсами и так именуемыми локальными областями хранения потоков (Thread Local Storage, SLT) в DLL с многопоточной поддержкой.

BOOL DllMain(HINSTANCE hDll, DWORD Reason, LPVOID Reserved)

Параметр hDll является дескриптором экземпляра DLL, возвращенным функцией LoadLibrary. Значение NULL параметра Точки входа библиотеки DLL Reserved показывает на то, что подключение процесса к библиотеке вышло в итоге вызова функции Load-Library; другие значения этого параметра свидетельствуют о подключении к библиотеке в итоге неявного связывания во время загрузки. Схожим образом, к значению NULL параметра Reserved приводит и отключение процесса от библиотеки в итоге Точки входа библиотеки DLL вызова функции FreeLibrary.

Параметр Reason может иметь одно из 4 значений: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. Функции точки входа DLL обычно употребляют операторы switch и в качестве индикатора удачного выполнения возвращают значение TRUE.

Система сериализует вызовы DllMain таким макаром, что в каждый момент времени делать Точки входа библиотеки DLL ее может только один поток (к подробному дискуссии потоков мы приступим в главе 7). Эта сериализация очень существенна, так как операции инициализации, которые должна делать DllMain, не должны прерываться до их окончания. По этой же причине снутри точки входа не рекомендуется использовать блокирующие вызовы функций, к примеру Точки входа библиотеки DLL, функций ввода/вывода либо функций ожидания (см. главу 8), так как они будут препятствовать запуску точки входа другими потоками. А именно, не следует вызывать снутри точки входа DLL функции LoadLibrary и LoadLibraryEx, так как это будет порождать дополнительные вызовы точек входа DLL.

Функция DisableThreadLibraryCalls отменяет отправку обозначенному экземпляру DLL извещений о подключении Точки входа библиотеки DLL и выключении потоков. Запрет отправки извещений может понадобиться в тех случаях, когда потоки не нуждаются в каких-то уникальных ресурсах во время инициализации.

Управление версиями DLL

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

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

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

• Для приложений, использующих освеженную функциональность DLL, вероятны варианта связывания с прежними версиями DLL.

Трудности сопоставимости разных версий Точки входа библиотеки DLL DLL, носящие арготическое заглавие "ужаса DLL", не являются настолько наточенными, если в одном каталоге поддерживать только одну версию DLL. Но предоставить отдельный каталог для каждой из разных версий совсем не так просто, как может показаться. Существует несколько других вариантов решения этой задачи.

• Можно использовать номер версии DLL Точки входа библиотеки DLL в именах .DLL– и .LIB-файлов, обычно в виде суффикса. Так, чтоб соответствовать номеру версии, применяемой в данной книжке, в примерах, приведенных на Web-сайте книжки, и во всех проектах употребляются файлы Utility_3_0.LIB и Utility_3_0.DLL. Применяя очевидное либо неявное связывание, приложения могут формулировать свои требования к версиям и Точки входа библиотеки DLL получать доступ к файлам с разными именами. Такое решение типично для UNIX-приложений.

• Компания Microsoft ввела понятие параллельных DLL (side-by-side DLL), либо сборок (assemblies) и компонент (components). При таком подходе в приложение нужно включать объявление на языке XML, в каком определяются требования к DLL. Рассмотрение этой темы Точки входа библиотеки DLL выходит за рамки данной книжки, но дополнительную информацию вы сможете получить на Web-сайте компании Microsoft, в разделе, посвященном вопросам разработки приложений.

• Платформа .NET Framework предоставляет дополнительные средства поддержки выполнения приложений в критериях сосуществования разных версий DLL.

В примерах проектов, применяемых в данной книжке, употребляется 1-ый из отмеченных подходов, предусматривающий Точки входа библиотеки DLL включение номеров версий в названия файлов. С целью предоставления дополнительной поддержки, обеспечивающей возможность получения приложениями инфы о DLL, во всех DLL реализована функция DllGetVersion. Не считая того, Microsoft предоставляет эту косвенно вызываемую функцию в качестве стандартного средства получения инфы о версии в динамическом режиме. Обозначенная функция имеет последующий макет Точки входа библиотеки DLL:

HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi )

Информация о DLL ворачивается в структуре DLLVERSIONINFO, в какой имеются поля типа DWORD для характеристик cbSize (размер структуры), dwMajorVersion, dwMinorVersion, dwBuildNumber и dwPlatformID. В последнем поле, dwPlatformID, может быть установлено значение DLLVER_PLATFORM_NT, если библиотека не производится под управлением Windows 9x, либо DLLVER Точки входа библиотеки DLL_PLATFORM_WINDOWS, если это ограничение отсутствует. В поле cbSize должно находиться значение sizeof (DLLVERSIONINFO). В случае удачного выполнения функция возвращает значение NOERROR. Функция DllGetVersion реализована в проекте Utility_3_0.

Резюме

Система управления памятью Windows предоставляет последующие способности:

• Внедрение средств Windows, осуществляющих управление кучей, также обработчиков исключений для обнаружения и обработки ошибок Точки входа библиотеки DLL, возникающих при рассредотачивании памяти, существенно упрощает логическую компанию.

• Внедрение нескольких независящих куч обладает рядом преимуществ по сопоставлению с рассредотачиванием памяти из одной кучи.

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

• DLL являются принципиальным особым случаем отображения файлов и могут загружаться или очевидным, или неявным образом. DLL, созданные для использования многими Точки входа библиотеки DLL приложениями, должны предоставлять информацию о версии библиотеки.

В последующих главах

Мы окончили обзор задач, решаемых в рамках 1-го процесса. Дальше мы перебегаем к исследованию способов параллельной обработки, поначалу на уровне процессов (глава 6), а потом — потоков (глава 7). В следующих главах показано, как организовать синхронизацию и взаимодействие параллельно выполняющихся операций по обработке данных.

Дополнительная литература

Отображение Точки входа библиотеки DLL файлов, виртуальная память и ошибки страничек

Описание этих принципиальных понятий содержится в книжке [38], а их углубленное обсуждение вы сможете отыскать в документации, поставляемой вкупе с большинством ОС.

Структуры данных и методы

Деревьям поиска и методам сортировки посвящено огромное количество работ, включая [39] и [34].

Внедрение очевидного связывания

DLL и очевидное связывание имеют Точки входа библиотеки DLL базовое значение для использования модели СОМ, которая обширно используется при разработке программного обеспечения Windows. Значимость функций LoadLibrary и GetProcAddress продемонстрирована в главе 1 книжки [3].

Упражнения

5.1. Спроектируйте и проведите опыты для оценки выигрыша в производительности, достигаемого за счет использования флага HEAP_NO_SERIALIZE при вызове функций HeapCreate и HeapAlloc. Как зависит этот Точки входа библиотеки DLL показатель от размера кучи и размера блока? Видна ли разница в результатах для разных версий Windows? На Web-сайте книжки находится программка HeapNoSr.c, которая поможет вам приступить к выполнению этого и последующего упражнений.

5.2. Измените тестовую программку из предшествующего упражнения таким макаром, чтоб она позволяла найти, генерирует ли функция Точки входа библиотеки DLL malloc исключения либо возвращает нулевой указатель в случае нехватки памяти. Является ли обнаруженное поведение функции корректным? Сравните также производительность, обеспечиваемую функцией malloc, с плодами предшествующего упражнения.

5.3. Толика затратных издержек при рассредотачивании памяти из кучи колеблется зависимо от применяемой версии Windows, что в особенности приметно в случае выходящих из Точки входа библиотеки DLL потребления версий Windows 9x. Спроектируйте и проведите опыт для определения количества блоков памяти фиксированного размера, которые любая из систем предоставляет в одной куче. Используя SEH для определения того момента, когда распределенными оказываются все блоки, вы существенно упростите программку. Схожим образом ведет себя программка clear.с, находящаяся на Web-сайте Точки входа библиотеки DLL книжки, если игнорировать часть ее кода, ответственную за очевидное тестирование ОС. Меж иным, эта программка употребляется в неких тестах по измерению временных черт для гарантии того, что данные, приобретенные в процессе выполнении предшествующего теста, не остались в памяти.

5.4. Методом конфигурации программки sortFL (программка 5.4) сделайте программку sortHP, распределяющую память для буфера, размер Точки входа библиотеки DLL которого довольно велик, чтоб в нем уместился весь файл, и сделайте считывание файла в этот буфер. Отображение файла использовать не следует. Сравните производительность обеих программ.

5.5. В программке 5.5 использованы указатели типа _base, специальные для Microsoft С. Если ваш компилятор не поддерживает это средство (но в любом случае — просто в Точки входа библиотеки DLL качестве упражнения) переработайте программку 5.5, используя для генерации значений базисного указателя макрос, массив либо другой механизм.

5.6. Напишите программку поиска записей по обозначенному ключу в файле, проиндексированном с применением программки 5.5. Для этой цели комфортно пользоваться функцией bsearch, входящей в состав библиотеки С.

5.7. Реализуйте программку tail из главы 3, используя отображение файлов Точки входа библиотеки DLL.

5.8. Расположите вспомогательные функции ReportError, PrintStrings, PrintMsg и ConsolePrompt в DLL и перекомпонуйте некие из программ, с которыми мы работали ранее. Проделайте то же самое с функциями Options и GetArgs, предназначенными, соответственно, для обработки характеристик командной строчки и аргументов. Принципиально, чтоб как вспомогательная DLL, так и вызывающая программка использовали также и библиотеку С Точки входа библиотеки DLL в виде DLL. К примеру, в Visual C++ и Visual Studio 6.0 изберите, начав со строчки головного меню, последующие команды: Project (Проект), Settings (Характеристики), вкладку C/C++, Category (Code Generation) (Категория (Генерация кода)), Use Run-Time Library (Multithreaded DLL) (Использовать библиотеку времени выполнения (многопоточная DLL)). Заметьте, что библиотеки Точки входа библиотеки DLL DLL, вообщем говоря, должны обеспечивать многопоточную поддержку, так как они будут употребляться потоками нескольких процессов. Пример вероятного решения содержится в проекте Utilities_3_0, доступном на Web-сайте книжки.

5.9. Измените программку 5.7 таким макаром, чтоб решение относительно того, какую DLL следует использовать, базировалось на размере файла и конфигурации системы. .LIB-файл тут не Точки входа библиотеки DLL требуется, потому прокрутите в голове, как отменить его генерацию. Для определения типа файловой системы используйте функцию GetVolumeInformation.

5.10. Сделайте дополнительные DLL для функции преобразования из предшествующего упражнения, любая версия которых употребляет иную методику обработки файлов, и расширьте вызывающую программку таким макаром, чтоб она сама решала, когда и какую версию использовать.

ГЛАВА Точки входа библиотеки DLL 6

Управление процессами

Процесс (process) представляет собой объект, владеющий своим независящим виртуальным адресным местом, в каком могут располагаться код и данные, защищенные от других процессов. В свою очередь, снутри каждого процесса могут независимо производиться одна либо несколько потоков (threads). Поток, выполняющийся снутри процесса, может сама создавать новые потоки и новые независящие Точки входа библиотеки DLL процессы, также управлять взаимодействием объектов меж собой и их синхронизацией.

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

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


tochnost-distancionnih-metodov.html
tochnost-izvlecheniya-informacii.html
tochnost-pricela-lekarstva-raznie-nuzhni.html