• Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом


  • Иллюстрированный самоучитель по Delphi 7 для профессионалов

    Инициализация и завершение работы DLL

    Применительно к рассматриваемому нами примеру, модернизированный исходный код библиотеки DataCheck будет выглядеть так:

    Листинг 28.3. Часть исходного кода динамической библиотеки DataCheck c функцией обратного вызова.

    …
    {Часть исходного кода опущена (см. листинг 24.2)}
    exports
    IsValidlnt,
    IsValidDate index 1,
    IsValidTime index 2 name 'ValidTime',
    procedure DLLEntryPoint(Reason: Integer);
    begin
    case Reason of
    DLL_PROCESS_ATTACH: ShowMessage('Первая загрузка DLL'); DLL_PROCESS_DETACH:;
    DLL_THREAD_ATTACH: ShowMessage('Создан новый поток'); DLL_THREAD_DETACH:; end; end;
    begin
    DLLProc: = @DLLEntryPoint;
    DLLEntryPoint(DLL_PROCESS_ATTACH);
    end.
    

    Процедура DLLEntryPoint обеспечивает простой показ сообщения о полученном значении параметра. В коде инициализации глобальной переменной DLLProc передается адрес процедуры DLLEntryPoint. Затем эта процедура вызывается явно с параметром DLL_PROCESS_ATTACH.

    У недоверчивого читателя может возникнуть вопрос – а зачем городить такие сложности, если можно просто использовать код в секции инициализации? Дело в том, что этот код выполняется только при запуске DLL. Поэтому, как, например, вовремя уничтожить создаваемые в библиотеке объекты при завершении ее работы? Для этого можно использовать функцию обратного вызова:

    Листинг 28.4. Создание и удаление объекта при загрузке и выгрузке динамической библиотеки DataCheck.

    …
    (Часть исходного кода опущена (см. листинг 24.2)}
    exports
    IsValidlnt,
    IsValidDate index 1,
    IsValidTime index 2 name 'ValidTime',
    type TSomeObject = class(TObject)
    Fieldl: String; end; var FirstObj: TSomeObject;
    procedure DLLEntryPoint(Reason: Word);
    begin
    case Reason of DLL_PROCESS_ATTACH:
    begin
    FirstObj: = TSomeObject.Create; FirstObj.Fieldl: = 'Объект создан'; ShowMessage(FirstObj.Fieldl);
    end;
    DLL__PROCESS_DETACH: FirstObj. Free;
    DLL_THREAD_ATTACH: ShowMessage('Создан новый поток'); DLL_THREAD_DETACH:;
    end;
    end;
    begin
    DLLProc: = @DLLEntryPoint;
    DLLEntryPoint(DLL_PROCESS_ATTACH);
    end.
    

    При завершении работы динамической библиотеки вызывается процедура, на которую указывает адрес, содержащийся в переменной ExitProc:

    var ExitProc: Pointer;
    
    Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.