Можно ли использовать dll
Содержание статьи
Файл формата dll: как открыть, описание, особенности
Современные программы состоят из нескольких модулей, которые включают в себя массивы данных, классы,…
Современные программы состоят из нескольких модулей, которые включают в себя массивы данных, классы, сервисы, требуемые библиотеки. Такой подход разрешает при переписывании ПО не редактировать полностью код, а изменять только необходимые функции, которые заключены в составных частях. Так как открыть DLL файл стандартными средствами Windows невозможно, приходится использовать другие методы.
Файлы с расширением DLL – что это и для чего нужны
Файлы DLL – это динамически подключаемые библиотеки. Установленная в операционную систему программа может не иметь в своем составе всех нужных для работы данных, а использовать те, которые уже присутствуют в ОС. За счет этого также достигается экономия памяти – работающие программы используют одни и те же DLL.
Если же программа (или библиотека) будет повреждена, то это не скажется на работоспособности остального ПО.
Когда и как появились
Библиотеки DLL появились одновременно с ОС Windows. Разработчики предполагали, что это облегчит программирование приложений и поможет упорядочить использование общих ресурсов в течение сеанса работы.
Но со временем выяснилось, что в ряде случаев возникает тупиковая ситуация, которая получила название «DLL hell». Такое случалось, когда два или более приложений требуют доступа к разным (и не совместимым друг с другом) библиотекам. В результате Windows начинала работать нестабильно.
Только в последних версиях ОС удалось создать механизм, предотвращающий возникновения сбоев – технологию Side-by-side assembly, который испытали в XP, но окончательно он стал применяться в Windows Vista.
При помощи каких программ открываются файлы с расширением .dll
Программный код ОС Windows – проприетарный. Это значит, что разработчики не предусмотрели штатных средств, применяя которые, пользователь сможет менять системный код. Для открытия DLL придется использовать специальные программные пакеты. А подключать имеющиеся DLL к разрабатываемой программе можно с применением ПО Microsoft.
В Windows 10
Пользователи, работающие в десятой версии Windows, не всегда знают, чем открыть DLL. Для подключения библиотеки к проекту понадобится либо Visual Studio, либо VisualFoxPro. Эти программные комплексы доступны для скачивания на официальном портале компании Microsoft. Для редактирования допускается использовать ResourceHacker – утилиту для ознакомления и редактирования различных типов файлов.
Чтобы открыть динамически подключаемую библиотеку, следует нажать в главном меню:
- Пункт «Файл».
- «Открыть».
- Выбрать требуемую библиотеку, воспользовавшись проводником.
- После завершения изменений закрыть файл, сохранив изменения.
Из чего состоит рабочая область программы ResHacker:
- верхняя главная панель – для запуска функциональных команд: открыть, скомпилировать, сохранить;
- левое окно – содержит список объектов, которые входят в состав библиотеки;
- центральная часть – текст программного кода.
В Windows 7
Проблема – чем открыть DLL для редактирования в операционной системе Windows 7 решается так же как и для 10 версии. Еще применяется утилита Resource Tuner – редактор ресурсов. Она дает возможность менять код в DLL на свое усмотрение и сохранять библиотеки.
В онлайн-сервисах
Это понадобится, если речь идет о страницах сайта. В DLL содержатся скрипты, которые отвечают за корректную работу сервера.
Открыть библиотеки можно, используя браузеры:
- Firefox;
- Opera;
- Chrome.
Как открыть DLL, используя Visual Studio
Программная среда Visual Studio дает возможность создавать, подключать DLL к текущему проекту и редактировать его. Для этого используется синтаксис языка программирования.
Особенности работы с DLL файлами и возможные проблемы
Некоторые DLL не удастся не только изменить, но даже открыть. Это происходит с защищенными библиотеками и проблема не решается без специальных программ для взлома.
Пользователи также сталкиваются с отсутствием библиотек, необходимых для работы некоторых программ. ОС при этом выдает сообщение о том, что «файл не найден». Для устранения неисправности требуется отыскать недостающие DLL с помощью поисковых систем и скачать. Затем – поместить в требуемую папку.
В редких случаях библиотеки DLL придется зарегистрировать в ОС:
- В Windows 7 (и более поздних версиях) войти в каталог, содержащий требуемый файл.
- Нажать «Shift» + правую клавишу мышки.
- В появившемся меню выбрать строчку: «Открыть окно команд».
- Набрать: regsvr32 dllxxxx.dll, где «dllxxxx.dll» – название регистрируемой библиотеки.
- Нажать «Enter».
В качестве итога
Работой с DLL занимаются программисты, но опытным пользователям также полезно будет знать основы работы с динамически подключаемыми библиотеками. Это может пригодиться для изменения или извлечения данных из файлов прикладных программ.
Источник
Что такое dll файл, как он работает, и почему их порой не достаёт?
Нередко при попытке запустить какое-то приложение (часто игру), пользователь получает сообщение об отсутствующем файле .dll. Самый простой, на первый взгляд, способ – найти и скачать подходящий dll файл в сети. Однако часто такой вариант развития событий чреват последствиями. Читаем далее.
Что такое dll файл?
DLL файл – файл динамически подключаемой библиотеки (библиотеки динамической ссылки)- некий набор кодов и данных для выполнения в Windows конкретного действия в рамках файлу отведённых. К dll-кам часто обращаются приложения (как сторонние так и внутренние – от имени Windows) в конкретный момент и часто на определённый срок. Тяжеловесные приложения (опять же игры) часто сами вместе с установкой пополняют хранилище dll файлов, так как система ими по умолчанию не обладает. Таким образом по типу действия dll файлы чем-то напоминают исполнительные файлы .exe, (и те и другие используют один формат файлов Portable Executable – PE) кроме некоторых моментов:
- сам по себе dll запустить напрямую нельзя
- в то же время к одному набору dll файлов могут обращаться многие приложения, причём одновременно
- а слово “ссылки” в названии файла означает, что, помимо всего прочего, они могут вызывать и друг друга по ситуации: запуск одного такого файла может вызвать запуск десятков других dll-лек. В отличие от статических библиотек .lib, которые уже находятся в модуле и работают только во время этапа компиляции программы (часто файлы .lib обнаруживаются в файлах .exe и .dll) – в виде отдельного файла в Windows такие файлы трудно найти.
Вообще, dll-лки – прерогатива Windows, которая сама частично состоит именно из этих файлов (“пингвинятники” в Линукс имеют дело с аналогичными файлами с расширением .so), активно используя COM компоненты и библиотеки .NET. В этом легко убедиться, совершив экскурс в системную папку system32 (в 64-х битных версиях это ещё и папка C:WindowsSysWOW64):
Какие dll файлы задействуются программами прямо сейчас, можно узнать, запустив, к примеру, утилиты Autoruns for Windows , пробежавшись по вкладкам программы:
Как работает dll файл?
Так, открывая или сворачивая окна, натыкаясь на ошибки, переустанавливая оборудование в системе, наводя курсор и видя всплывающие подсказки, мы часто натыкаемся на бесчисленное (как нам кажется) множество диалоговых и просто справочных окон, которые в Windows становятся всё догадливее. И часто просто не обращаем на это внимание. Такие сообщения, например, и есть плод перекрещивающейся работы dll-файлов Windows.
Любая устанавливаемая в Windows программа всегда использует либо свои немногочисленные или имеющиеся в системе dll-ки. Программа обычно загружает свою dll-ку во время автозагрузки через специальную библиотеку Win32 API LoadLibrary или по сигналу с другого dll-файла. Обычно это выглядит так:
- exe-шник запускается, Windows его загружает, проверяя таблицу параметров и величин, в которой написано, что, мол, “мне нужны вот такие функции вот этого dll файла и вон того dll файла”. На “околотехническом” языке это называется импортированием функций dll файла в исполнительный exe файл программы.
- код загрузчика ищет обозначенные файлы dll, и обнаружив их, загружает в память
- начинает работать сам файл.dll. В нём есть уже свой список экспортируемых функций, который как телефонный коммутатор объединяет между собой адреса функций внутри самого файла (их в одном файле может быть немало); если это необходимо, функция файла1.dll может обратиться и к некоторым функциям файла2.dll. Exe-шник запущенной вами программы теперь работает с файлами, просто обращаясь к этим адресам напрямую.
К СВЕДЕНИЮ
Возможность же использовать dll-ки одновременно многими приложениями позволяет разработчикам программ в Windows не корпеть над каждым куском кода заново (хотя львиную долю кода для установки, удаления и т.д. приходится писать самому), а использовать готовые и прошитые с установкой в Windows библиотеки файлов, например Microsoft .Net Framework. Вы в Windows их видите каждый день, ведь dll-ки – это системные функции, классы, переменные, элементы интерфейса: меню, окна, диалоги, шрифты, курсоры, пиктограммы, строки и т.п. И самое главное для разработчиков программ для Windows преимущество использования таких файлов состоит в том, что обновляя свои dll-файлы, Windows обновляет и чужие программы, защищая от багов, ошибочных оповещений и т.п. Так что этот факт – лишняя копейка в копилку тех, кто понимает, что прежде всего системными обновлениями гнушаться не стоит.
Куда они исчезают, или почему в системе отсутствует dll файл ?
попытка снять с регистрации файл для последующей правильной его установки в реестре провалилась
Этот вопрос абсолютно аналогичен вопросу, рассматриваемому в статье “DirectX – для каждой игры свой?” Так что давайте поэтапно, если в системе возникли вопросы по поводу пропажи или повреждения dll. Так вот, основные “неполадки” вокруг проблем с dll-ками крутятся вокруг таких вариантов развития событий:
- файл отсутствует – да, скорее всего, он никуда не пропал: речь идёт о его/их повреждении. Его местонахождение – системная папка, папка с набором специальных библиотек или программа с установленными файлами. А, следовательно, речь может быть идти о программном (или, не дай Бог, физическом) сбое на вашем жёстком диске: просто попробуйте его найти с помощью привычных средств поиска и убедиться в его наличии
- файл действительно отсутствует – антивирусная программа прекрасно распознаёт зловредное действие таких файлов (особенно при запуске в песочнице) и может принять решение на удаление файла. Ну, и оно вам надо – такая программа и последствия от её использования?
- файл отсутствует сразу после первого запуска программы – такая беда часто подстерегает тех, кто при установке программы пренебрегает рекомендациями к установке, пытаясь при этом действовать без оглядки на системные требования. Попробуйте переустановить программу, внимательно устанавливая или обновляя предложенные пакеты библиотек; в противном случае попробуйте найти необходимый файл по названию в сети. НО. Предупреждаю сразу – это очень чревато, так что читайте статью до конца.
Почему нельзя просто его скачать?
Самый первый и самый опасный вариант. Даже если вы уже определились с версией и разрядностью файла. Я бы первым же делом заразил его, подсунув туда что-то типа трояна, замаскировав его под функцию обращения к какому-нибудь процессу. Рассчитывая на то, что пользователь в спешке запустить любимую программу согласится на всё, пропуская мимо глаз свист антивируса. Поверьте, 5-6 из 10 сайтов в сети так и делают. Их основная задача – принять запрос из поисковой выдачи на скачивание подозрительных (а какими ещё могут быть с точки зрения современных антивирусов и даже современных версий браузеров) файлов, и подсунуть вам. Как работает dll файл вы уже примерно знаете, и какую цепочку действий против вас в вашей Windows он создаст, знает только хакер.
Ещё один вариант – в ответ на ваш запрос вы наткнётесь на чаще всего платную, но очень навязчивую и красочную программу по ремонту системных файлов, функции которой крайне бедны (даже если запущенный после её установки “анализ” показал, что в системе “ну всё очень плохо!”).
Но да ладно: скачали, вирусов нет… На популярном и наиболее часто используемом в этих случаях ресурсе:
https://ru.dll-files.com/
решения не обнаружилось: всё равно ошибка и ничего не работает. Почему? Ответ для внимательных очевиден: вы никогда не задумывались, что Windows обновляет прежде всего? Да-да, скачанный вами файл просто морально устарел, и вам в любом случае придётся искать уже обновлённую его версию. Вобщем, действуйте в этом варианте на свой страх и риск.
Напоследок, но крайне важно. С ручным расположением dll всё немного сложнее. Эта тема достойна отдельной статьи, и она связана с функцией Перенаправителя файловой системы File System Redirector. Краткий совет же такой – переустановите службу или программу, но старайтесь избегать прямого вмешательства в директорию С:Windows.
Как исправить ошибку dll ?
Подход к попытке исправить возникшую ошибку зависит именно от самостоятельной диагностики вероятных причин. О них вы знаете из предыдущего абзаца. А значит:
- битые сектора (плохие секторы) жёсткого диска – нередко уже привычная ошибка компьютера, который подключён к розетке или ноутбука, у которого барахлит блок питания или батарея. Это даже нормально, иначе в Windows не появилась отдельная ремонтная утилита (в составе целого их набора) chkdsk.exe, призванная такие ошибки исправлять. Умение работать с утилитой – первейшая необходимость пользователя. При этом, если имя повреждённого файла вам известно, не обязательно прогонять полномасштабную проверку всего тома на ошибки. Можно начать с конкретной проверки файла, при которой команда проверки, к примеру, примет вид:
sfc /scanfile=c:windowssystem32kernel32.dll
Прокатывает не всегда, ибо это инструмент общего действия. Однако попробовать стоит. Внутри побитого файла она ничего изменить не сможет, но системные файлы могут быть подменены. Однако, если задет файл конкретной программы, утилита отрапортует, что всё хорошо и захлопнется. Оставив вас ни с чем.
Обязательна ли регистрация файла RegSvr32?
- обнаружили повреждённые секторы и избавились от них? Самое время проверить систему на целостность файлов. В Windows 7 и Windows 10 для этого есть различные подходы, но все они сводятся к проверке системных файлов на целостность. Используйте утилиту sfc /scannow из состава ремонтных утилит в Windows 7 или утилиту восстановления образа Windows (для “10-ки”). Один из вариантов: проверить в поиске по сети имя файла, что за зверь и снять его с дистрибутива Windows или из “живой ” системы соседа.
- ссылку на сайт по поиску dll-лок видели? Отправляйтесь сначала туда. Не очень давно там появилось НЕбесплатное решение исправить проблему с dll файлами с помощью специального клиента. Я его не пробовал по причинам, которые следуют ниже.
- при попытке исправить ошибку вы – не исключено – наткнётесь на круговую зависимость: когда восстановление одного файла вызывает окно с ссылкой на ошибку повреждения другого. В статье про “Ошибочный образ” я как раз рассматриваю попытку “разрулить” такую ситуацию. Сразу скажу – безуспешно. Причина тому – повреждение целого класса библиотек dll в результате классического случая присущего прыщавым геймерам “скачивать из сети без оглядки”, отключив при этом антивирус, который из раза в раз сообщает об устанавливаемых с игрой троянах. Ложные, мол, срабатывания . Как итог: переустановка пакетов Microsoft .NET Framework всех версий наряду с Microsoft Visual C++ Redistributable. А это, кто знает, проще “Винду переустановить”.
- однако, несмотря на написанное выше, ошибка dll может быть вызвана просто некорректной установкой самой программы. Этот тот случай, когда проблема стала появляться в защищённой системе СРАЗУ после установки чего-то. Итог – переустановите (или “перекачайте” – образ программы может быть битым из-за некачественной раздачи или потери пакетов с вашей стороны)
- приготовьтесь к тому, что более ничего не поделать. Вам нужен образ игры, откуда файл придётся переносить вручную. Если не повезёт – это переустановка.
- программа запущена на виртуальной машине. В этом случае вероятность появления таких ошибок значительно возрастает, причём ни один из вышеперечисленных советов не помогает: ни скачанный или взятый с соседнего компьютера файл, ни переустановка программы.
Советов здесь немного, и главный из них должен решаться ещё на этапе установки машины. Старайтесь не смешивать типы файловых систем самой машины и носителей для них и не разносите по разным томам папку с программой и носителями для неё.
- вариант последний – для профи. Набраться наглости и потребовать у разработчиков оригинальный dll файл с описанием проблемы. Не факт, что вы получите вразумительный ответ (или получите вообще), но вежливость с грамотно составленным запросом творит чудеса.
У меня всё, успехов вам.
Источник
Библиотека динамических ссылок (DLL) — Windows Client
- 09/22/2020
- Чтение занимает 11 мин
В этой статье
В этой статье описывается, что такое динамическая библиотека ссылок (DLL) и различные проблемы, которые могут возникнуть при использовании библиотек DLL. Здесь также описываются некоторые сложные проблемы, которые следует учитывать при разработке собственных DLL.
Исходная версия продукта: Windows 10 — все выпуски
Исходный номер КБ: 815065
Аннотация
В этой статье описываются динамические методы связывания, зависимости DLL, точки входа DLL, экспорт функций DLL и средства устранения неполадок DLL.
В этой статье сравнивались библиотеки DLL с сборками Microsoft .NET Framework.
Для операционных систем Windows большая часть функциональных возможностей операционной системы предоставляется DLL. Кроме того, при запуске программы в одной из этих операционных систем Windows большая часть функций программы может быть предоставлена с помощью DLL. Например, некоторые программы могут содержать множество различных модулей, а каждый модуль программы содержится и распространяется в DLL.
Использование DLL помогает повысить модульность кода, повторное использование кода, эффективное использование памяти и уменьшение дискового пространства. Таким образом, операционная система и программы загружаются быстрее, работают быстрее и принимают меньше места на диске на компьютере.
Если программа использует DLL, проблема, называемая зависимостью, может привести к тому, что программа не будет запускаться. Когда программа использует DLL, создается зависимость. Если другая программа переописает и разрывает эту зависимость, исходная программа может не запуститься успешно.
С появлением .NET Framework большинство проблем с зависимостями были устранены с помощью сборок.
Дополнительные сведения
Библиотека DLL — это библиотека, которая содержит код и данные, которые могут использоваться одновременно более чем одной программой. Например, в операционных системах Windows DLL Comdlg32 выполняет общие функции, связанные с диалогом. Каждая программа может использовать функции, содержащиеся в этой DLL, для реализации диалоговых окна «Открыть». Это помогает повысить повторное использование кода и эффективное использование памяти.
С помощью DLL программа может быть модульной в отдельные компоненты. Например, программа бухгалтерского учета может продаваться по модулям. Каждый модуль можно загрузить в основную программу во время запуска, если этот модуль установлен. Поскольку модули являются отдельными, время загрузки программы быстрее. Модуль загружается только при запросе этой функции.
Кроме того, обновления проще применять к каждому модуле, не затрагивая другие части программы. Например, у вас может быть программа заработной платы, и налоговые ставки меняются каждый год. Если эти изменения изолированы для DLL, вы можете применить обновление без необходимости повторного построения или установки всей программы.
В следующем списке описаны некоторые файлы, реализованные в операционных системах Windows в качестве DLL.
ActiveX элементов управления (OCX)
Примером ActiveX является календарь, позволяющий выбрать дату из календаря.
Файлы панели управления (CPL)
Примером CPL-файла является элемент, расположенный на панели управления. Каждый элемент является специализированной DLL.
Файлы драйвера устройства (DRV)
Примером драйвера устройства является драйвер принтера, который управляет печатью на принтере.
Преимущества DLL
В следующем списке описываются некоторые преимущества, которые предоставляются, когда программа использует DLL:
Использует меньше ресурсов
Если несколько программ используют ту же библиотеку функций, библиотека DLL может уменьшить дублирование кода, загружаемого на диск и в физической памяти. Это может значительно повлиять на производительность не только программы, запущенной на переднем плане, но и других программ, работающих в операционной системе Windows.
Повышает модульную архитектуру
DLL помогает разрабатывать модульные программы. Это помогает разрабатывать крупные программы, для работы с помощью нескольких языковых версий или программы, для работы с помощью модульной архитектуры. Примером модульной программы является программа учета с множеством модулей, которые могут динамически загружаться во время работы.
Упростит развертывание и установку
Если функции в DLL требуется обновление или исправление, развертывание и установка DLL не требуют повторной связи программы с DLL. Кроме того, если несколько программ используют один и тот же DLL- и другие программы, все они получают преимущества от обновления или исправления. Эта проблема может возникать чаще при использовании регулярно обновляемой или исправленной стороной DLL.
Зависимости DLL
Когда программа или DLL использует функцию DLL в другой DLL, создается зависимость. Программа больше не является автономным, и в случае с которым зависимость может быть нарушена, в ней могут возникнуть проблемы. Например, программа может не работать, если происходит одно из следующих действий:
- Зависимая DLL-версия обновляется до новой версии.
- Зависимый DLL-фиксирован.
- Зависимая DLL-версия перезаписывается более ранней версией.
- Зависимая DLL-система удаляется с компьютера.
Эти действия называются конфликтами DLL. Если обратная совместимость не обеспечивается, программа может не запуститься успешно.
В следующем списке описываются изменения, внесенные в Windows 2000 и более поздних операционных системах Windows, чтобы свести к минимуму проблемы зависимостей:
Защита файлов Windows
В Windows File Protection операционная система предотвращает обновление или удаление DLL системы несанкционированным агентом. Когда программа пытается удалить или обновить DLL-файл, определенный как системная DLL, Windows File Protection будет искать допустимую цифровую подпись.
Частные DLL
Частные DLL- и изоляция программы от изменений, внесенных в общие DLL. Частные DLL используют сведения о версии или пустой файл для применения версии DLL, используемой .local программой. Чтобы использовать частные DLL, найдите свои DLL в корневой папке программы. Затем для новых программ добавьте сведения о версии в DLL. Для старых программ используйте пустой .local файл. Каждый метод указывает операционной системе использовать частные DLL, расположенные в корневой папке программы.
Для устранения неполадок с DLL доступно несколько средств. Следующие средства являются некоторыми из этих средств.
DependencyМайл
Средство «Ветвь зависимостей» может рекурсивно проверять все зависимые DLL, используемые программой. Когда вы открываете программу в «Подмайловой зависимости», она проверяет следующее:
- В этой проверке проверяется наличие отсутствующих DLL.
- В этой папке проверяется наличие не допустимых программных файлов или DLL.
- В этой функции проверяется соответствие функций импорта и экспорта.
- Dependency При этом проверяется наличие циклической ошибки зависимостей.
- Компания Dependency При этом проверяет допустимые модули, так как они находятся в другой операционной системе.
С помощью DependencyМайл можно документировать все DLL, которые использует программа. Это может помочь предотвратить и устранить проблемы с DLL, которые могут возникнуть в будущем. При установке Visual Studio 6.0 он находится в следующем каталоге:
driveProgram FilesMicrosoft Visual StudioCommonTools
Универсальное решение проблем DLL
Средство DLL Universal Problem Solver (DUPS) используется для аудита, сравнения, документировать и отображать данные DLL. В следующем списке описаны средства, которые составляют средство DUPS:
Dlister.exe
Эта совработка содержит все DLL на компьютере и записи данных в текстовый файл или в файл базы данных.
Dcomp.exe
Эта программа сравнивает DLL, перечисленные в двух текстовых файлах, и создает третий текстовый файл, содержащий различия.
Dtxt2DB.exe
Эта программа загружает текстовые файлы, созданные с помощью Dlister.exe и Dcomp.exe в базу данных dllHell.
DlgDtxt2DB.exe
Эта с помощью этой программы предоставляет версию графического пользовательского интерфейса (GUI) Dtxt2DB.exe.
База данных справки DLL
База данных справки DLL помогает находить определенные версии DLL, установленные программным продуктом Майкрософт.
Разработка DLL
В этом разделе описываются проблемы и требования, которые следует учитывать при разработке собственных DLL.
Типы DLL
При загрузке DLL в приложении два метода связывания могут вызывать экспортные функции DLL. Два метода связывания — динамическое связывание во время загрузки и динамическое связывание во время работы.
Динамическое связывание во время загрузки
При динамическом связывание во время загрузки приложение выполняет явные вызовы экспортных функций DLL, таких как локальные функции. Чтобы использовать динамическое связывание во время загрузки, при компиляции и связывания приложения укажете файл загона (H) и файл библиотеки импорта (LIB). В этом случае linker предоставит системе сведения, необходимые для загрузки DLL и разрешения экспортируемой функции DLL во время загрузки.
Динамическое связывание во время запуска
При динамическом связывание во время работы приложение вызывает функцию или функцию для загрузки LoadLibrary LoadLibraryEx DLL во время работы. После успешной загрузки DLL функция используется для получения адреса экспортируемой функции GetProcAddress DLL, которую необходимо вызвать. При использовании динамического связывания во время запуска файл библиотеки импорта не требуется.
В следующем списке описываются критерии приложения, в соответствии с которыми следует использовать динамическое связывание во время загрузки, а когда — динамическое связывание во время запуска:
Производительность при запуске
Если важна начальная производительность запуска приложения, следует использовать динамическое связывание во время выполнения.
Простота использования
При динамическом связывание во время загрузки экспортные функции DLL похожи на локальные функции. Это упрощает вызов этих функций.
Логика приложения
При динамическом связывание во время работы приложение может ветвь загружать различные модули по мере необходимости. Это важно при разработке многоязычных версий.
Точка входа DLL
При создании DLL можно дополнительно указать функцию точки входа. Функция точки входа вызвана, когда процессы или потоки присоединяются к DLL или отсоединяются от DLL. Функцию точки входа можно использовать для инициализации структур данных или для уничтожения структур данных, как того требует DLL. Кроме того, если приложение многопоточная, можно использовать локальное хранилище потоков (TLS) для выделения памяти, которая является частной для каждого потока в функции точки входа. Следующий код является примером функции точки входа DLL.
BOOL APIENTRY DllMain(
HANDLE hModule,// Handle to DLL module
DWORD ul_reason_for_call,// Reason for calling function
LPVOID lpReserved ) // Reserved
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACHED: // A process is loading the DLL.
break;
case DLL_THREAD_ATTACHED: // A process is creating a new thread.
break;
case DLL_THREAD_DETACH: // A thread exits normally.
break; case DLL_PROCESS_DETACH: // A process unloads the DLL.
break;
}
return TRUE;
}
Когда функция точки входа возвращает значение FALSE, приложение не запустится, если вы используете динамическое связывание во время загрузки. Если вы используете динамическое связывание во время запуска, загрузка только отдельной DLL не будет.
Функция точки входа должна выполнять только простые задачи инициализации и не должна вызывать любые другие функции загрузки или завершения DLL. Например, в функции точки входа не следует напрямую или косвенно вызывать LoadLibrary функцию или LoadLibraryEx функцию. Кроме того, не следует вызывать FreeLibrary функцию, когда процесс завершается.
Примечание
В многопотоковых приложениях убедитесь, что доступ к глобальным данным DLL синхронизирован (потокобезопасн), чтобы избежать возможного повреждения данных. Для этого используйте TLS для предоставления уникальных данных для каждого потока.
Экспорт функций DLL
Чтобы экспортировать функции DLL, можно добавить ключевое слово функции в экспортные функции DLL или создать файл определения модуля (DEF), в который будут перечислены экспортные функции DLL.
Чтобы использовать ключевое слово функции, необходимо объявить каждую функцию, которую нужно экспортировать, с помощью следующего ключевого слова:
__declspec(dllexport)
Чтобы использовать экспортируемые функции DLL в приложении, необходимо объявить каждую функцию, которую необходимо импортировать, с помощью следующего ключевого слова: __declspec(dllimport)
Как правило, один файл загона, который имеет определенный и другой, используется для различения выписки по ifdef экспорту и этой import выписки.
Вы также можете использовать файл определения модуля для объявления экспортных функций DLL. При использовании файла определения модуля не нужно добавлять ключевое слово функции в экспортные функции DLL. В файле определения модуля объявляется заявление и LIBRARY EXPORTS утверждение для DLL. Ниже приводится пример файла определения.
// SampleDLL.def
//
LIBRARY «sampleDLL»
EXPORTS HelloWorld
Пример DLL и приложения
В Visual C++ 6.0 можно создать библиотеку DLL, выбрав тип проекта библиотеки Dynamic-Link Win32 или тип проекта MFC AppWizard (dll).
Следующий код является примером библиотеки DLL, созданной в Visual C++ с помощью типа проекта win32 Dynamic-Link Library.
// SampleDLL.cpp
//
#include «stdafx.h»
#define EXPORTING_DLL
#include «sampleDLL.h»
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved
)
{
return TRUE;
}
void HelloWorld()
{
MessageBox( NULL, TEXT(«Hello World»), TEXT(«In a DLL»), MB_OK);
}
// File: SampleDLL.h
//
#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld();
#else
extern __declspec(dllimport) void HelloWorld();
#endif
#endif
Следующий код является примером проекта приложения Win32, который вызывает экспортируемую функцию DLL в DLL SampleDLL.
// SampleApp.cpp
//
#include «stdafx.h»
#include «sampleDLL.h»
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HelloWorld();
return 0;
}
Примечание
При динамическом связывание во время загрузки необходимо связать библиотеку импорта SampleDLL.lib, которая создается при сборке проекта SampleDLL.
При динамическом связывание во время работы для вызова экспортируемой функции DLL используется код SampleDLL.dll, аналогичный следующему коду.
…
typedef VOID (*DLLPROC) (LPTSTR);
…
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;
hinstDLL = LoadLibrary(«sampleDLL.dll»);
if (hinstDLL != NULL)
{
HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, «HelloWorld»);
if (HelloWorld != NULL)
(HelloWorld);
fFreeDLL = FreeLibrary(hinstDLL);
}
…
При компиляции и привязке приложения SampleDLL операционная система Windows выполняет поиск DLL SampleDLL в следующих расположениях в следующем порядке:
Папка приложения
Текущая папка
Системная папка Windows
Примечание
Функция GetSystemDirectory возвращает путь к системной папке Windows.
Папка Windows
Примечание
Функция GetWindowsDirectory возвращает путь к папке Windows.
Сборка .NET Framework
С появлением .NET и .NET Framework большинство проблем, связанных с DLL, были устранены с помощью сборок. Сборка — это логическая единица функциональности, которая выполняется под управлением clR.NET. Сборка физически существует как DLL-файл или exe-файл. Однако сборка внутри не отличается от DLL Microsoft Win32.
Файл сборки содержит манифест сборки, метаданные типа, код промежуточного языка Майкрософт (MSIL) и другие ресурсы. Манифест сборки содержит метаданные сборки, которые предоставляют все сведения, необходимые для самостоятельного описания сборки. В манифест сборки включены следующие сведения:
- Имя сборки
- Сведения о версии
- Сведения о культуре
- Сведения о сильном имени
- Список сборок файлов
- Справочные сведения о типе
- Справочные и зависимые сведения о сборке
Код MSIL, содержащийся в сборке, не может выполняться напрямую. Вместо этого управление выполнением кода MSIL управляется с помощью CLR. По умолчанию при создании сборки сборка является частной для приложения. Чтобы создать общую сборку, необходимо назначить сборке сильное имя, а затем опубликовать сборку в глобальном кэше сборок.
В следующем списке описываются некоторые функции сборок по сравнению с функциями библиотек DLL Win32:
Самоо описание
При создании сборки все сведения, необходимые clR для запуска сборки, содержатся в манифесте сборки. Манифест сборки содержит список зависимых сборок. Таким образом, CLR может поддерживать согласованный набор сборок, используемых в приложении. В DLL Win32 невозможно поддерживать согласованность между набором DLL, используемых в приложении при использовании общих DLL.
Управление версиями
В манифесте сборки сведения о версии записываются и применяются CLR. Кроме того, политики версий могут применять использование определенной версии. В DLL Win32 управления версиями не может быть принудительно применено операционной системой. Необходимо убедиться, что DLL совместимы с обратной совместимости.
Развертывание с использованием одной стороны
Сборки поддерживают развертывание на стороне. Одно приложение может использовать одну версию сборки, а другое приложение может использовать другую версию сборки. Начиная с Windows 2000, при развертывании поддерживается поиск DLL в папке приложения. Кроме того, Windows File Protection предотвращает перезаписи или замену системных DLL несанкционированным агентом.
Самодостатоление и изоляция
Приложение, разработанное с помощью сборки, может быть изолировано от других приложений, работающих на компьютере. Эта функция помогает создавать установки без влияния.
Выполнение
Сборка запускается с разрешениями безопасности, предоставленными в манифесте сборки и контролируемыми CLR.
Независимый от языка язык
Сборку можно разработать с помощью любого из поддерживаемых язык?