436____________________________________________Глава 7

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

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

Для вызова библиотечной функции из библиотеки, присоединяемой подобным
образом, надо прежде всего загрузить библиотеку функцией LoadLibrary API Win-
dows. Затем с помощью функции GetProcAddress надо получить указатель на инте-
ресующую вас функцию библиотеки. Только после этого можно выполнять функ-
цию. А затем с помощью функции FreeLibrary надо выгрузить библиотеку из па-
мяти. Пусть, например, вы создали библиотеку mydll.dll, содержащую некоторую
функцию MyFunctionQ. Тогда для использования этой функции при динамиче-
ском присоединении библиотеки вам надо предусмотреть в своем приложении сле-
дующее. Вы должны объявить указатель на эту функцию. Например:

void (_stdcall *MyFunction)(HWIND)
Тогда операции с библиотекой могут строиться по следующей схеме:

// загрузка DLL
HINSTANCE dlllnstance = LoadLibrary("mudll-dll" ),•

// получение адреса функции
MyFunction = (void(_stdcall*)(HWIND) GetProcAddress(dlllnstance,

" MyFunction");

// вызов функции
MyFunction (Application-handle) ;

// выгрузка DLL
FreeLibrary(dlllnstance) ;

Как видите, все это достаточно громоздко. Так что если только нет острой не-
обходимости использовать именно динамическое связывание, лучше всегда испо-
льзовать статическое связывание.

7.5.3 Создание DLL

Создание своей DLL начинается с выполнения команды File | New и выбора в
окне New Items на странице New пиктограммы DLL. Вы попадете в окно Редактора
Кода, в котором появится следующий текст:

//-

//————————————————————

«include <vcl.h>

#pragma hdrstop

//——————————————————————

// Important note about DLL memory management when your DLL
// uses the static version of the RunTime Library:

//

// If your DLL exports any functions that pass String objects

// (or structs/ classes containing nested Strings) as parameter

// or function results, you will need to add the library

// MEMMGR.LIB to both the DLL project and any other projects

// that use the DLL.  You will also need to use MEMMGR.LIB

// if any other projects which use the DLL will be perfomring

// new or delete operations on any non-TObject-derived classes

// which are exported from the DLL. Adding MEMMGR.LIB to your

// project will change the DLL and its calling EXE's to use the