Nrd dll что это

Обновлено: 04.07.2024

Файл DLL (сокращение от Dynamic Link Library или динамическая библиотека ссылок). Представляет собой тип файла с определенными инструкциями, которые могут вызывать другие программы для выполнения определенных действий. Несколько программ могут совместно использовать инструкции, запрограммированные в одном файле, а при необходимости делать это и одновременно.

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

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

Исправление ошибок

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

Решить проблему простой загрузкой отсутствующего или удаленного DLL-файла удается не всегда и не во всех случаях это лучший способ. Об этом подробнее читайте в статье: «Где скачать библиотеку dll и как правильно это сделать».

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

Подробнее о библиотеках DLL

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

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

  • Файлы DLL полезны, потому что они позволяют программе разделить ее различные компоненты на уникальные отдельные модули, которые затем могут быть добавлены или удалены для включения или исключения определенных функций. Когда программное обеспечение работает таким образом с DLL, программа может использовать меньше памяти, потому что ей не нужно загружать все сразу
  • Библиотеки DLL позволяют производить обновление части программы без необходимости переустанавливать всю программу целиком. Чем больше программное обеспечение использует DLL, тем лучше, потому что все ее компоненты могут обновиться из единственного файла
  • Элементы управления ActiveX, файлы панели управления и драйверы устройств — это некоторые из файлов, которые Windows использует в качестве динамических библиотек. Соответственно, эти файлы используют расширение файлов OCX, CPL и DRV
  • Когда одна библиотека DLL использует инструкции из другой библиотеки, то эта первая библиотека теперь зависит от второй. Это облегчает функционирование DLL-библиотек, но может привести к дополнительным сбоям. Если ошибка возникнет во второй библиотеке, то это скорее всего повлияет и на первую, так как она связана с ней инструкциями
  • Если DLL обновляется до более новой версии, перезаписывается более старой или удаляется с компьютера, программа, использующая этот DLL может совсем перестать работать или будет работать с ошибками и сбоями.

Не удаляйте файлы, о которых вы ничего не знаете.

Популярные игры часто становятся жертвами ошибки «отсутствует rld.dll». От неё страдают такие шедевры игровой индустрии, как Fifa, Sims, Crysis и Pro Evolution Soccer. Проблема появляется из-за того, что файл rld.dll был изменён, удалён или повреждён. Иногда при установке игры библиотеки некорректно загружаются на жёсткий диск, что приводит к ошибке. В таком случае поможет переустановка игры, но чаще всего она не даёт никакого результата. В основном ошибка rld.dll появляется в приложениях, скачанных с торрент-трекера. Они вносят неразбериху в динамические библиотеки, удаляют их и модифицируют. Изменённые dll не в состоянии выполнять свою функцию, из-за чего возникают ошибки. Также пиратские файлы привлекают внимание антивирусных программ. Они удаляют подозрительные библиотеки при первой же активности, или отправляют их в карантин. Если вы уверены в том, что файл не заражён, то можете достать его из карантина и занести в список исключений антивируса. Если файл отсутствует или неработоспособен, то вам придётся искать рабочую версию rld.dll и встраивать её в Windows.

Есть два пути:

rld.dll

Быстрый метод решения проблемы — скачать rld.dll и положить его в системную папку. Когда оригинальная библиотека вернётся на место, ошибка пропадёт. Файл rld.dll скачать для игр Crysis 3/ Fifa 13/ Sims 4 вы сможете на нашем сайте. Он подходит для Windows 7, 8 и 10. Куда положить библиотеку? Для 64х битной копии Windows найдите папку C:\Windows\SysWOW64, а для системы x86 — C:\Windows\System32. Зарегистрируйте новую библиотеку и запустите проблемную игру.

Ошибка осталась, или вылезла новая? Значит нужно поставить пакет Microsoft Visual C++ 2013. Он загрузить на компьютер много нужных библиотек, в том числе rld.dll. После установки программы обязательно перезагрузите свой компьютер. Теперь вы сможете, наконец, поиграть в долгожданную игру.

Рекомендуем в первую очередь, скачать и установить полностью пакет Microsoft Visual C++ 2013. Ошибка должна сразу исчезнуть.

Как установить DLL файл вы можете прочитать на страницы, в которой максимально подробно описан данный процесс.

Что такое dll файл?

dll файл

Какие dll файлы задействуются программами прямо сейчас, можно узнать, запустив, к примеру, утилиты Autoruns for Windows , пробежавшись по вкладкам программы:

dll файл для программы

Как работает dll файл?

Любая устанавливаемая в Windows программа всегда использует либо свои немногочисленные или имеющиеся в системе dll-ки. Программа обычно загружает свою dll-ку во время автозагрузки через специальную библиотеку Win32 API LoadLibrary или по сигналу с другого dll-файла. Обычно это выглядит так:

К СВЕДЕНИЮ

Куда они исчезают, или почему в системе отсутствует dll файл ?

перерегистрация файлов dll

попытка снять с регистрации файл для последующей правильной его установки в реестре провалилась

Почему нельзя просто его скачать?

решения не обнаружилось: всё равно ошибка и ничего не работает. Почему? Ответ для внимательных очевиден: вы никогда не задумывались, что Windows обновляет прежде всего ? Да-да, скачанный вами файл просто морально устарел , и вам в любом случае придётся искать уже обновлённую его версию. Вобщем, действуйте в этом варианте на свой страх и риск.

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

на компьютере отсутствует .

Советов здесь немного, и главный из них должен решаться ещё на этапе установки машины. Старайтесь не смешивать типы файловых систем самой машины и носителей для них и не разносите по разным томам папку с программой и носителями для неё.

image

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

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

Содержание

  • Структура DLL
  • DLL & Python
    • Подключение DLL
    • Типы данных в С и Python
    • Аргументы функция и возвращаемые значения
    • Своя DLL и ее использование

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

    Структура DLL

    DLL — Dynamic Link Library — динамическая подключаемая библиотека в операционной системе (ОС) Windows. Динамические библиотеки позволяют сделать архитектуру более модульной, уменьшить количество используемых ресурсов и упрощают модификацию системы. Основное отличие от .EXE файлов — функции, содержащиеся в DLL можно использовать по одной.

    Учитывая, что статья не о самих библиотеках, лучше просто оставить здесь ссылку на довольно информативную статью от Microsoft: Что такое DLL?.

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

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

    Рисунок 1 — Пустой template, предлагаемый Code Blocks для проекта DLL.

    На рисунке 1 приведен шаблон, который предлагает Code Blocks, при выборе проекта типа DLL. В представленном шаблоне есть две функции:

    Для начала стоит подробнее рассмотреть функцию DllMain . Через нее ОС может уведомлять библиотеку о нескольких событиях (fdwReason):

    DLL_PROCESS_ATTACH – подключение DLL. Процесс проецирования DLL на адресное пространство процесса. С этим значением DllMain вызывается всякий раз, когда какой-то процесс загружает библиотеку с явной или неявной компоновкой.

    DLL_PROCESS_DETACH – отключение DLL от адресного пространства процесса. С этим значением DllMain вызывается при отключении библиотеки.

    DLL_THREAD_ATTACH – создание процессом, подключившим DLL, нового потока. Зачем DLL знать о каких-то там потоках? А вот зачем, далеко не каждая динамическая библиотека может работать в многопоточной среде.

    DLL_THREAD_DETACH – завершение потока, созданного процессом, подключившим DLL. Если динамическая библиотека создает для каждого потока свои "персональные" ресурсы (локальные переменные и буфера), то это уведомление позволяет их своевременно освобождать.

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

    У DllMain не так много аргументов, самый важный fdwReason уже рассмотрен выше, теперь о двух других:

    • Аргумент lpvReserved указывает на способ подключения DLL:
      • 0 — библиотека загружена с явной компоновкой.
      • 1 — библиотека загружена с неявной компоновкой.

      О явной и неявной компоновке можно прочесть подробно в статье: Связывание исполняемого файла с библиотекой DLL.

      В предложенном на рисунке 1 шаблоне есть функция SomeFunction , которая может быть экспортирована из динамической библиотеки. Для того, чтобы это показать, при объявлении функции указывается __declspec(dllexport) . Например, так:

      Функции, не объявленные таким образом, нельзя будет вызывать снаружи.

      DLL & Python

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

      Подключение DLL

      Основной библиотекой в Python для работы с типами данных, совместимыми с типами языка С является ctypes . В документации на ctypes представлено много примеров, которым стоит уделить внимание.

      Чтобы начать работать с DLL, необходимо подключить библиотеку к программе на Python. Сделать это можно тремя способами:

      • cdll — загружает динамическую библиотеку и возвращает объект, а для использования функций DLL нужно будет просто обращаться к атрибутам этого объекта. Использует соглашение вызовов cdecl.
      • windll — использует соглашение вызовов stdcall. В остальном идентична cdll.
      • oledll — использует соглашение вызовов stdcall и предполагается, что функции возвращают код ошибки Windows HRESULT. Код ошибки используется для автоматического вызова исключения WindowsError.

      Для первого примера будем использовать стандартную Windows DLL библиотеку, которая содержит всем известную функцию языка С — printf() . Библиотека msvcrt.dll находится в папке C:\WINDOWS\System32 .

      Код Python:

      Результат:

      Можно использовать подключение библиотеки с помощью метода windll либо oledll , для данного кода разницы не будет, вывод не изменится.

      Если речь не идет о стандартной библиотеке, то конечно следует использовать вызов с указанием пути на dll. В ctypes для загрузки библиотек предусмотрен метод LoadLibrary . Но есть еще более эффективный конструктор CDLL , он заменяет конструкцию cdll.LoadLibrary . В общем, ниже показано два примера вызова одной и той же библиотеки msvcrt.dll.

      Код Python:

      Иногда случается, что необходимо получить доступ к функции или атрибуту DLL, имя которого Python не "примет"… ну бывает. На этот случай имеется функции getattr(lib, attr_name) . Данная функция принимает два аргумента: объект библиотеки и имя атрибута, а возвращает объект атрибута.

      Код Python:

      Результат:

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

      Типы данных в С и Python

      Модуль ctypes предоставляет возможность использовать типы данных совместимые с типами в языке С. Ниже приведена таблица соответствия типов данных.

      Сtypes type C type Python type
      c_bool _Bool bool (1)
      c_char char 1-character string
      c_wchar wchar_t 1-character unicode string
      c_byte char int/long
      c_ubyte unsigned char int/long
      c_short short int/long
      c_ushort unsigned short int/long
      c_int int int/long
      c_uint unsigned int int/long
      c_long long int/long
      c_ulong unsigned long int/long
      c_longlong __int64 or long long int/long
      c_ulonglong unsigned __int64 or unsigned long long int/long
      c_float float float
      c_double double float
      c_longdouble long double float
      c_char_p char * (NUL terminated) string or None
      c_wchar_p wchar_t * (NUL terminated) unicode or None
      c_void_p void * int/long or None

      Таблица 1 — Соответствие типов данных языка Python и языка C, которое предоставляет модуль ctypes .

      Первое, что стоит попробовать — это использовать указатели, куда без них? Давайте напишем программу, где создадим строку и указатель на неё, а потом вызовем printf() для них:

      Результат:

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

      Аргументы функций и возвращаемые значения

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

      Например, стандартная функция strcat принимает два указателя на строки и возвращает один указатель на новую строку. Давайте попробуем ей воспользоваться.

      Код Python:

      Результат:

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

      Своя DLL и ее использование

      Пример 1

      Шаблон DLL уже был рассмотрен выше, а сейчас, когда дело дошло до написания своей DLL и работы с ней, выскочили первые и очевидные грабли — несовместимость разрядности DLL и Python. У меня на ПК установлен Python x64, оказалось, что как бы не были DLL универсальны, разрядность DLL должна соответствовать разрядности Python. То есть, либо ставить компилятор x64 и Python x64, либо и то и то x32. Хорошо, что это не сложно сделать.

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

      Код DLL на С:

      Код Python:

      Функция SomeFunction получает указатель на строку и выводит её в окно. На рисунке ниже показана работа программы.




      Рисунок 2 — Демонстрация работы шаблона библиотеки из Code Blocks.

      Все действия происходящие в кейсе DLL_PROCESS_ATTACH , код которого приведен ниже, вызываются лишь одной строкой в Python коде:



      Рисунок 3 — Действия происходящие при подключении DLL.

      Пример 2

      Чтобы подвести итог по использованию DLL библиотек из Python, приведу пример, в котором есть начальная инициализация параметров и передача новых через указатели на строки и структуры данных. Этот код дает понять, как написать аналог структуры С в Python. Ниже привожу код main.c , man.h и main.py .

      Код DLL на С:

      В коде main.h определена структура Passport с тремя полями: два указателя и целочисленная переменная. Кроме того, четыре функции объявлены, как экспортируемые.

      Код DLL на С:

      Внутри кейса DLL_PROCESS_ATTACH происходит выделение памяти под строки и начальная инициализация полей структуры. Выше DllMain определены функции:

      GetPassport — вывод полей структуры passport в консоль.

      *SetName(char new_name)** — установка поля name структуры passport .

      *SetSurname(char new_surname)** — установка поля surname структуры passport .

      *SetPassport(Passport new_passport)** — установка всех полей структуры passport . Принимает в качестве аргумента указатель на структуру с новыми полями.

      Теперь можно подключить библиотеку в Python.

      Код на Python

      В коде выше многое уже знакомо, кроме создания структуры аналогичной той, которая объявлена в DLL и передачи указателя на эту структуру из Python в 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.

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