00:15 Dynamic-Link Library: Теория + Практика | ||||||||||||||||||||
При неявной загрузке DLL загружается (проецируется на адресное пространство вызывающего процесса) при его создании. Если при загрузке возникает ошибка - процесс останавливается и разрушается. Для выполнения неявной загрузки приложению требуются: - Заголовочный файл (*.h) с прототипами функций, описаниями классов и типов, которые используются в приложении. - Библиотечный файл (*.lib), в котором описывается список экспортируемых из DLL функций (переменных), и их смещения, необходимые для правильной настройки вызовов функций. В проекте TestVCL подключим наш заголовочный файл:
Далее, объявим прототип:
Чтобы убедится в том, что всё работает, прописываем в конструкторе формы:
Для того, чтобы выполнить явную загрузку программист должен попыхтеть, управляя DLL через функции WinAPI. Наиболее часто рассматриваемые WinAPI функции: DisableThreadLibraryCalls, FreeLibrary, FreeLibraryAndExitThread, GetModuleFileName, GetModuleHandle,GetProcAddress, LoadLibrary ... При этом, основными функциями являются: LoadLibrary[Ex] - позволяют загрузить DLL в адресное пространство хост-процесса. FreeLibrary - функция, используемая для явной выгрузки DLL. GetProcAddress - функция, позволяющая получить виртуальный адрес экспортируемой из DLL функции(или переменной) для ее последующего вызова. Общая методика выглядит так: 1. Загрузить DLL с помощью LoadLibrary. 2. Получить указатели на необходимые объекты с помощью GetProcAddress. 3. Выгрузить DLL после завершения всех действий. Теперь возникает вопрос, как же проверить теорию на практике? Всё, что нужно, это добавить TestDLL.lib к проекту (также, как и при неявной загрузке). А дальше, для проверки снова пишем в конструкторе формы:
Остался один неосвещенный вопрос. Почему же название функции "ShowSum" мы ищем в библиотеке с нижним подчёркиванием? Виновато во всём декорирование имён. Естественно, такое декорирование нам вообще не по душе. Избавиться от него можно объявляя все экспортируемые функции с модификатором extern "C" - тогда компилятор не будет искажать имя функции. Однако, как мы видим, нижние подчёркивание всё же добавилось. Это один из нюансов среды C++ Builder. Однако, можно отучить его добавлять нижнее подчёркивание таким образом: Project -> Options -> C++ Compiler -> Output -> Generate underscores on symbol names - перевести в состояние false. | ||||||||||||||||||||
|
Всего комментариев: 0 | |