Как из dll вытащить методы

Обновлено: 04.07.2024

В этой статье описывается, что такое динамическая библиотека ссылок (DLL) и различные проблемы, которые могут возникнуть при использовании DLLs. В нем также описаны некоторые сложные проблемы, которые следует учитывать при разработке собственных DLLs.

Применяется к: Windows 10 — все выпуски
Исходный номер КБ: 815065

Сводка

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

Для Windows операционных систем большая часть функций операционной системы предоставляется DLL. Кроме того, при запуске программы на одной из Windows операционных систем большая часть функций программы может быть предоставлена DLLs. Например, некоторые программы могут содержать много различных модулей, и каждый модуль программы содержится и распространяется в DLLs.

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

Если программа использует DLL, проблема, называемая зависимостью, может привести к тому, что программа не будет работать. Когда программа использует DLL, создается зависимость. Если другая программа переописает и нарушает эту зависимость, оригинальная программа может не успешно выполниться.

Дополнительная информация

DLL — это библиотека, которая содержит код и данные, которые могут использоваться одновременно более чем одной программой. Например, в Windows операционных системах DLL Comdlg32 выполняет общие функции, связанные с диалоговое окно. Каждая программа может использовать функции, содержащиеся в этом DLL, для реализации открытого диалоговое окно. Это способствует повторному использованию кода и эффективному использованию памяти.

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

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

В следующем списке описываются некоторые файлы, реализованные как DLLs в Windows операционных системах:

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 защиты файлов операционная система предотвращает обновление или удаление системных DLLs несанкционированным агентом. Когда установка программы попытается удалить или обновить DLL, определяемую как система DLL, Windows файловой защиты будет искать допустимую цифровую подпись.

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

Средства устранения неполадок DLL

Для устранения неполадок DLL доступны несколько средств. Вот некоторые из этих средств.

Уокер зависимостей

Средство Уокер зависимостей может повторно сканировать все зависимые DLLs, используемые программой. При открываемой программе в "Уолкер зависимостей" уолкер зависимостей делает следующие проверки:

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

С помощью Уолкера зависимостей можно документировать все DLLs, которые использует программа. Это может помочь предотвратить и устранить проблемы DLL, которые могут возникнуть в будущем. В следующем каталоге при установке Visual Studio 6.0 расположено приложение Dependency Walker.

drive\Program Files\Microsoft Visual Studio\Common\Tools

Универсальное решение проблем DLL

Средство универсального решения проблем DLL (DUPS) используется для аудита, сравнения, документа и отображения данных DLL. В следующем списке описываются утилиты, которые составляют средство DUPS:

Эта утилита регистрирует все DLLs на компьютере и регистрирует сведения в текстовом файле или файле базы данных.

Эта утилита сравнивает DLLs, перечисленные в двух текстовых файлах, и создает третий текстовый файл, содержащий различия.

Эта утилита загружает текстовые файлы, созданные с помощью Dlister.exe и Dcomp.exe в базу данных dllHell.

Эта утилита предоставляет графический пользовательский интерфейс (GUI) версии Dtxt2DB.exe утилиты.

База данных справки DLL

База данных справки по DLL поможет вам найти конкретные версии DLLs, установленные программным обеспечением Майкрософт.

Разработка DLL

В этом разделе описываются проблемы и требования, которые следует учитывать при разработке собственных DLLs.

Типы DLLs

При загрузке DLL в приложении два метода связывания разрешат вызывать экспортируемую функцию DLL. Два метода связывания — динамическая привязка во время нагрузки и динамическая связь во время работы.

Динамическая привязка по времени нагрузки

В динамической привязке времени нагрузки приложение делает явные вызовы для экспортируемой DLL-функций, таких как локальные функции. Чтобы использовать динамическое связывание во время нагрузки, при компиляции и ссылке приложения предостережете файл (.h) и файл импортной библиотеки (.lib). При этом linker предоставит системе сведения, необходимые для загрузки DLL и решения экспортируемой точки функции DLL во время нагрузки.

Динамическая привязка по времени

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

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

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

В динамических связях с нагрузкой экспортные функции DLL похожи на локальные функции. Это упрощает вызов этих функций.

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

Точка входа в DLL

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

Когда функция точки входа возвращает значение 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. Следующий код — пример файла определения.

Пример DLL и приложения

В Visual C++ 6.0 можно создать DLL, выбрав тип проекта Win32 Dynamic-Link Library или тип MFC AppWizard (dll).

Следующий код — пример DLL, созданного в Visual C++ с помощью типа проекта Win32 Dynamic-Link Library.

Следующий код — пример проекта приложения Win32, который вызывает экспортируемую функцию DLL в DLL SampleDLL.

При динамической привязке во время нагрузки необходимо связать импортную библиотеку SampleDLL.lib, созданную при создании проекта SampleDLL.

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

При компиляции и ссылке приложения SampleDLL операционная Windows ищет DLL SampleDLL в следующих расположениях в этом порядке:

Папка Windows системы

Функция GetSystemDirectory возвращает путь к папке Windows системы.

Функция GetWindowsDirectory возвращает путь Windows папки.

Файл сборки содержит манифест сборки, метаданные типа, код промежуточного языка Microsoft (MSIL) и другие ресурсы. Манифест сборки содержит метаданные сборки, которые предоставляют всю информацию, необходимую для самостоятельного описания сборки. В манифест сборки включены следующие сведения:

  • Имя сборки
  • Сведения о версии
  • Сведения о культуре
  • Информация о сильных именах
  • Список файлов сборки
  • Тип справочной информации
  • Справочные и зависящие сведения о сборке

Код MSIL, содержащийся в сборке, не может выполняться напрямую. Вместо этого выполнение кода MSIL управляется с помощью CLR. По умолчанию при создании сборки сборка является закрытой для приложения. Для создания общей сборки необходимо назначить сборке сильное имя, а затем опубликовать сборку в кэше глобальной сборки.

В следующем списке описываются некоторые функции сборки по сравнению с функциями DLLs Win32:

При создании сборки в манифесте сборки содержатся все сведения, необходимые clR для запуска сборки. Манифест сборки содержит список зависимых сборок. Таким образом, CLR может поддерживать согласованный набор сборок, используемых в приложении. В DLL Win32 невозможно поддерживать согласованность между набором DLLs, используемыми в приложении при использовании общих DLLs.

В манифесте сборки сведения о версиях записываются и применяются clR. Кроме того, политики версий могут обеспечить применение использования для конкретной версии. В DLL Win32 версия не может применяться операционной системой. Необходимо убедиться, что DLLs совместимы с обратной совместимость.

Развертывание бок о бок

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

Самостоятельное сдерживание и изоляция

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

Сборка запускается под разрешениями безопасности, которые поставляются в манифесте сборки и контролируются clR.

У меня есть файл DLL. Как я могу просмотреть функции в этой DLL?

Для нативного кода, вероятно, лучше всего использовать Dependency Walker . Также можно использовать утилиту командной строки dumpbin , поставляемую с Visual Studio.

В более новых версиях VS попробуйте DumpBin в качестве внешнего инструмента .

Используйте бесплатную программу просмотра экспорта DLL , она очень проста в использовании.

@sumit можно конкретнее? эти инструменты работают у меня на протяжении многих лет. На самом деле инструмент работает красиво, просто и понятно, именно то, что мне нужно. Это отличный инструмент для создания списка методов / функций, но он не показывает параметры методов (или их типы). Очень здорово иметь что-то маленькое и компактное, а не какой-то раздутый продукт, как обычно бывает с официальными продуктами MS.

Вы можете попробовать браузер объектов в Visual Studio.

обозреватель объектов перемещен в View . И да, не работает (зачем, это майкрософт) @Kimmax Да, но user32.dll - это собственная Windows DLL, а не COM-сервер. Только COM-серверы (например, COM-библиотеки, элементы управления ActiveX, * .ocx . ) могут иметь библиотеки типов, если они изначально были скомпилированы. Для собственных (= не COM-объектов) DLL могут работать некоторые другие инструменты, упомянутые здесь (dumpbin и др.). То есть, если DLL экспортирует функции по имени, а не только по порядковому номеру.
  • dumpbin /IMPORTS <path-to-file> должен предоставить функцию, импортированную в эту DLL.
  • dumpbin /EXPORTS <path-to-file> должен предоставлять функции, которые он экспортирует.

Используйте dotPeek от JetBrains.

Поскольку ildasm является продуктом Microsoft и устанавливается на ПК по умолчанию, если у вас установлена ​​Visual Studio. Я считаю, что это лучший вариант. Он также имеет пользовательский интерфейс, поэтому вам не нужно использовать командную строку. Спасибо Его можно найти: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ <VERSION> \ bin

Не сообщая нам, на каком языке эта dll / сборка, мы можем только догадываться.

декомпилятор только говорит вам, какие функции там есть. Можем ли мы увидеть их реализацию как-нибудь?

Затем дважды щелкните DLL в папке ссылок, и вы увидите, какие функции она выполняет в окне OBJECT EXPLORER.

Чем открыть DLL для редактирования

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

Открываем DLL-файлы для редактирования

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

Способ 1: Resource Hacker

    Скачайте Resource Hacker с официального сайта и произведите простую установку. После этого запустите софт и переходите к открытию файла.

Переход к открытию файла для редактирования в программе Resource Hacker

Выбор файла для открытия в программе Resource Hacker

Иерархия содержимого файла DLL в программе Resource Hacker

Редактирование исходного кода открытого файла в программе Resource Hacker

Переключение в бинарный вид исходного кода в программе Resource Hacker

Сохранение отредактированного файла в доступном формате в программе Resource Hacker

Способ 2: Hex Workshop

Еще один популярный редактор DLL-файлов имеет название Hex Workshop, однако реализован он с определенными отличиями от предыдущего софта. Связаны эти особенности и с процедурой редактирования, которая выполняется немного сложнее из-за отображения кода только в бинарном виде, но с разными кодировками.

    После инсталляции запустите Hex Workshop и приступайте к открытию файла.

Переход к открытию файла в программе Hex Workshop

Открытие файла для редактирования в программе Hex Workshop

Просмотр содержимого файла в программе Hex Workshop

Просмотр сведений отдельного блока исходного кода в программе Hex Workshop

Панель инструментов для редактирования файлов в программе Hex Workshop

Способ 3: Доступная среда разработки

Сейчас практически все программисты создают и редактируют код в специальной среде разработки. Ею выступает программное обеспечение, заточенное под выполнение работ с кодом. Обычно там присутствуют вспомогательные инструменты, упрощающие работу с проектами. Некоторые из них справляются с открытием элементов формата DLL и позволяют их редактировать. Сейчас мы хотим взять за пример Embarcadero RAD Studio последней версии.

    Запустите Embarcadero RAD Studio или любую другую подобную среду разработки и переходите к запуску файла.

Переход к открытию файла для редактирования в программе Embarcadero RAD Studio

Выбор файла для редактирования в программе Embarcadero RAD Studio

Изменение сведений о файле и его вида в программе Embarcadero RAD Studio

Отображение файла в бинарном виде в программе Embarcadero RAD Studio

Как можно заметить, подобные редакторы отображают содержимое немного в другом виде, что поможет во время особого редактирования, например, изменения вспомогательных описаний или сохраненного по умолчанию расположения. Если Embarcadero RAD Studio вас не устраивает, рекомендуем ознакомиться с другим подобным софтом в отдельном нашем обзоре от другого автора, перейдя по указанной ниже ссылке.

Способ 4: Sublime Text

Как известно, Sublime Text является не совсем обычным текстовым редактором. Его основная функциональность нацелена на работу с исходным кодом и его компиляцией. В этом софте подсвечивается синтаксис и происходит автоматическое определение языка. Что касается открытия DLL, то сделает он это немного лучше, чем привычные текстовые редакторы.

Открытие файла для редактирования в программе Sublime Text

Просмотр содержимого DLL-файла в программе Sublime Text

Попытка компиляции DLL-файла в программе Sublime Text

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

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

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

В этой статье описывается, что такое динамическая библиотека ссылок (DLL) и различные проблемы, которые могут возникнуть при использовании DLLs. В нем также описаны некоторые сложные проблемы, которые следует учитывать при разработке собственных DLLs.

Применяется к: Windows 10 — все выпуски
Исходный номер КБ: 815065

Сводка

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

Для Windows операционных систем большая часть функций операционной системы предоставляется DLL. Кроме того, при запуске программы на одной из Windows операционных систем большая часть функций программы может быть предоставлена DLLs. Например, некоторые программы могут содержать много различных модулей, и каждый модуль программы содержится и распространяется в DLLs.

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

Если программа использует DLL, проблема, называемая зависимостью, может привести к тому, что программа не будет работать. Когда программа использует DLL, создается зависимость. Если другая программа переописает и нарушает эту зависимость, оригинальная программа может не успешно выполниться.

Дополнительная информация

DLL — это библиотека, которая содержит код и данные, которые могут использоваться одновременно более чем одной программой. Например, в Windows операционных системах DLL Comdlg32 выполняет общие функции, связанные с диалоговое окно. Каждая программа может использовать функции, содержащиеся в этом DLL, для реализации открытого диалоговое окно. Это способствует повторному использованию кода и эффективному использованию памяти.

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

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

В следующем списке описываются некоторые файлы, реализованные как DLLs в Windows операционных системах:

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 защиты файлов операционная система предотвращает обновление или удаление системных DLLs несанкционированным агентом. Когда установка программы попытается удалить или обновить DLL, определяемую как система DLL, Windows файловой защиты будет искать допустимую цифровую подпись.

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

Средства устранения неполадок DLL

Для устранения неполадок DLL доступны несколько средств. Вот некоторые из этих средств.

Уокер зависимостей

Средство Уокер зависимостей может повторно сканировать все зависимые DLLs, используемые программой. При открываемой программе в "Уолкер зависимостей" уолкер зависимостей делает следующие проверки:

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

С помощью Уолкера зависимостей можно документировать все DLLs, которые использует программа. Это может помочь предотвратить и устранить проблемы DLL, которые могут возникнуть в будущем. В следующем каталоге при установке Visual Studio 6.0 расположено приложение Dependency Walker.

drive\Program Files\Microsoft Visual Studio\Common\Tools

Универсальное решение проблем DLL

Средство универсального решения проблем DLL (DUPS) используется для аудита, сравнения, документа и отображения данных DLL. В следующем списке описываются утилиты, которые составляют средство DUPS:

Эта утилита регистрирует все DLLs на компьютере и регистрирует сведения в текстовом файле или файле базы данных.

Эта утилита сравнивает DLLs, перечисленные в двух текстовых файлах, и создает третий текстовый файл, содержащий различия.

Эта утилита загружает текстовые файлы, созданные с помощью Dlister.exe и Dcomp.exe в базу данных dllHell.

Эта утилита предоставляет графический пользовательский интерфейс (GUI) версии Dtxt2DB.exe утилиты.

База данных справки DLL

База данных справки по DLL поможет вам найти конкретные версии DLLs, установленные программным обеспечением Майкрософт.

Разработка DLL

В этом разделе описываются проблемы и требования, которые следует учитывать при разработке собственных DLLs.

Типы DLLs

При загрузке DLL в приложении два метода связывания разрешат вызывать экспортируемую функцию DLL. Два метода связывания — динамическая привязка во время нагрузки и динамическая связь во время работы.

Динамическая привязка по времени нагрузки

В динамической привязке времени нагрузки приложение делает явные вызовы для экспортируемой DLL-функций, таких как локальные функции. Чтобы использовать динамическое связывание во время нагрузки, при компиляции и ссылке приложения предостережете файл (.h) и файл импортной библиотеки (.lib). При этом linker предоставит системе сведения, необходимые для загрузки DLL и решения экспортируемой точки функции DLL во время нагрузки.

Динамическая привязка по времени

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

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

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

В динамических связях с нагрузкой экспортные функции DLL похожи на локальные функции. Это упрощает вызов этих функций.

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

Точка входа в DLL

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

Когда функция точки входа возвращает значение 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. Следующий код — пример файла определения.

Пример DLL и приложения

В Visual C++ 6.0 можно создать DLL, выбрав тип проекта Win32 Dynamic-Link Library или тип MFC AppWizard (dll).

Следующий код — пример DLL, созданного в Visual C++ с помощью типа проекта Win32 Dynamic-Link Library.

Следующий код — пример проекта приложения Win32, который вызывает экспортируемую функцию DLL в DLL SampleDLL.

При динамической привязке во время нагрузки необходимо связать импортную библиотеку SampleDLL.lib, созданную при создании проекта SampleDLL.

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

При компиляции и ссылке приложения SampleDLL операционная Windows ищет DLL SampleDLL в следующих расположениях в этом порядке:

Папка Windows системы

Функция GetSystemDirectory возвращает путь к папке Windows системы.

Функция GetWindowsDirectory возвращает путь Windows папки.

Файл сборки содержит манифест сборки, метаданные типа, код промежуточного языка Microsoft (MSIL) и другие ресурсы. Манифест сборки содержит метаданные сборки, которые предоставляют всю информацию, необходимую для самостоятельного описания сборки. В манифест сборки включены следующие сведения:

  • Имя сборки
  • Сведения о версии
  • Сведения о культуре
  • Информация о сильных именах
  • Список файлов сборки
  • Тип справочной информации
  • Справочные и зависящие сведения о сборке

Код MSIL, содержащийся в сборке, не может выполняться напрямую. Вместо этого выполнение кода MSIL управляется с помощью CLR. По умолчанию при создании сборки сборка является закрытой для приложения. Для создания общей сборки необходимо назначить сборке сильное имя, а затем опубликовать сборку в кэше глобальной сборки.

В следующем списке описываются некоторые функции сборки по сравнению с функциями DLLs Win32:

При создании сборки в манифесте сборки содержатся все сведения, необходимые clR для запуска сборки. Манифест сборки содержит список зависимых сборок. Таким образом, CLR может поддерживать согласованный набор сборок, используемых в приложении. В DLL Win32 невозможно поддерживать согласованность между набором DLLs, используемыми в приложении при использовании общих DLLs.

В манифесте сборки сведения о версиях записываются и применяются clR. Кроме того, политики версий могут обеспечить применение использования для конкретной версии. В DLL Win32 версия не может применяться операционной системой. Необходимо убедиться, что DLLs совместимы с обратной совместимость.

Развертывание бок о бок

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

Самостоятельное сдерживание и изоляция

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

Сборка запускается под разрешениями безопасности, которые поставляются в манифесте сборки и контролируются clR.

Читайте также: