Программирование для Windows NT (том 2)


Динамический импорт функций во время выполнения приложения - часть 2


Функция LoadLibrary может быть вызвана разными приложениями для одной и той же DLL-библиотеки несколько раз. В этом случае в среде операционной системы Microsoft Windows версии 3.1 загрузка DLL-библиотеки выполняется только один раз. Последующие вызовы функции LoadLibrary приводят только к увеличению счетчика использования DLL-библиотеки. Что же касается Microsoft Windows NT, то при многократном вызове функции LoadLibrary различными процессами функция инициализации DLL-библиотеки получает несколько раз управление с кодом причины вызова, равным значению DLL_PROCESS_ATTACH.

В качестве примера приведем фрагмент исходного текста приложения, загружающего DLL-библиотеку из файла DLLDEMO.DLL:

typedef HWND (WINAPI *MYDLLPROC)(LPSTR);

MYDLLPROC    GetAppWindow;

HANDLE       hDLL;

 

hDLL = LoadLibrary("DLLDEMO.DLL");

if(hDLL != NULL)

{

  GetAppWindow = (MYDLLPROC)GetProcAddress(hDLL,

    "FindApplicationWindow");

  if(GetAppWindow != NULL)

  {

    if(GetAppWindow(szWindowTitle) != NULL)

      MessageBox(NULL, "Application window was found",

        szAppTitle, MB_OK | MB_ICONINFORMATION);

    else

      MessageBox(NULL, "Application window was not found",

        szAppTitle, MB_OK | MB_ICONINFORMATION);

  }

  FreeLibrary(hDLL);

}

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

Если точка входа получена, функция вызывается через указатель GetAppWindow.

После использования DLL-библиотека освобождается при помощи функции FreeLibrary, прототип который показан ниже:

void WINAPI FreeLibrary(HINSTANCE hLibrary);

В качестве параметра этой функции следует передать идентификатор освобождаемой библиотеки.

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




- Начало -  - Назад -  - Вперед -