Как вызвать функцию статической библиотеки при выполнении программы, использующей эту библиотеку

Находясь в разделяемой библиотеке C, можно выполнить следующие действия для выполнения инициализатора или финализатора при запуске или завершении программы C, использующей эту разделяемую библиотеку:

BOOL APIENTRY DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        _initialize();
    }
    else if (reason == DLL_PROCESS_DETACH)
    {
        _finalize();
    }
    return true;
}

Это не работает, если та же самая программа на C вместо этого использует статическую версию библиотеки C.

Любая идея, как это можно исправить?

Ответ прост: это невозможно. Статическая библиотека на самом деле не что иное, как набор объектных файлов. Для статических библиотек нет специальной инициализации или очистки во время выполнения, поскольку статические библиотеки не загружаются во время выполнения.

Some programmer dude 06.03.2019 12:42

Возможно, эта идея поможет (конкретно GCC): geeksforgeeks.org/…

nm_tp 06.03.2019 12:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Статическая библиотека "запускается" и "заканчивается", когда программа, частью которой она является, запускается и завершается.

Я взял слова «начинает» и «заканчивает» в кавычках, потому что, как только приложение скомпоновано, статической библиотеки как таковой в нем уже нет. Функции, полученные из статической библиотеки, неотличимы от функций, полученных из приложения.

Итак, если у вас есть что-то, что нужно сделать перед вызовом какой-либо функции в конкретной статической библиотеке, вы должны создать функцию инициализации и вызвать ее явно из своего кода, например. из вашей функции main(). Точно так же, если у вас есть что-то, что нужно сделать после того, как вы закончите использовать функции из статической библиотеки, вы должны создать функцию очистки и вызвать ее явно из своего кода. На самом деле это вполне нормальная практика.

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

  • Вам не нужно менять код приложения, если вы измените способ связывания библиотеки.
  • То, что вы можете делать в DLLMain, довольно ограничено. Даже не все функции в DLL ядра безопасно вызывать. Это не относится к явной функции инициализации, вызываемой после загрузки DLL.

Другие вопросы по теме