Навигация:
<< >> Оглавление Указатель

Приложения

Приложение А. Функции, константы и структуры RDS

А.2. События блока и связанные с ними описания

А.2.2. Главная функция DLL

Динамически подключаемая библиотека (DLL) с функциями моделей блоков RDS, как и любая другая DLL в Windows, должна иметь главную функцию (точку входа), которая вызывается при загрузке библиотеки в память и ее выгрузке. Чаще всего эта функция имеет имя DllMain или DllEntryPoint (имя главной функции DLL обычно указывается в описании используемого для создания библиотек компилятора). В главной функции обычно выполняются действия, общие для всех моделей блоков в данной библиотеке:

Эти действия не обязательно выполнять именно в главной функции DLL – она просто предоставляет для них удобное место вызова. Написание главной функции DLL подробно рассмотрено в §2.2 руководства программиста.

Главная функция DLL имеет следующий вид:

  int WINAPI DllMain(
     hinst,      // Дескриптор модуля DLL
    unsigned long reason, // Причина вызова главной функции
    void *lpReserved      // Зарезервировано
  );

Параметры функции

hinst (HINSTANCE)
Дескриптор модуля загруженной DLL. Его можно использовать для доступа к различным ресурсам (изображениям, строкам и т.п.), хранящимся в файле DLL вместе с функциями, а также для определения пути к файлу DLL функцией Windows API GetModuleFileName.
reason (unsigned long)
Причина вызова главной функции DLL (одна из четырех констант Windows API):
DLL_PROCESS_ATTACH Процесс (в данном случае – «rds.exe» или «rds64.exe») загрузил данную DLL в память. Обычно в этот момент выполняются все действия по инициализации глобальных переменных, с которыми работают функции этой DLL.
DLL_THREAD_ATTACH Процесс создал новый поток (в DLL с моделями блоков обычно не используется).
DLL_THREAD_DETACH Поток завершился (в DLL с моделями блоков обычно не используется).
DLL_PROCESS_DETACH Процесс выгружает данную DLL из памяти. В этот момент выполняются действия по очистке глобальных данных, если это необходимо.
lpReserved (void*)
Указывает на способ загрузки или выгрузки библиотеки. При создании DLL с моделями блоков или модулями автоматической компиляции для RDS этот параметр не используется.

Возвращаемые значения

При вызове главной функции при загрузке DLL в память процесса (при этом параметр reason равен DLL_PROCESS_ATTACH) возврат ненулевого значения сигнализирует об успешности инициализации, возврат нулевого – об ошибках. В остальных случаях возвращаемое значение не используется.

Пример

Главная функция, обеспечивающая моделям блоков доступ ко всем сервисным функциям RDS с помощью макросов из файла «RdsFunc.h».

  #include <windows.h>
  #include <RdsDef.h>

  // Подготовка описаний сервисных функций
  #define RDS_SERV_FUNC_BODY GetInterfaceFunctions
  #include <RdsFunc.h>

  // Главная функция DLL
  int WINAPI DllMain( /*hinst*/,
                     unsigned long reason,
                     void* /*lpReserved*/)
  { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
      { // Получение доступа к функциям
        if(!GetInterfaceFunctions())
           // Сообщение: старая версия RDS
      }
    return 1;
  }


<< >> Оглавление Указатель