Как вызвать функцию статической библиотеки при выполнении программы, которая использует эту библиотеку - PullRequest
0 голосов
/ 06 марта 2019

Находясь в общей библиотеке 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.

Есть идеи, как это можно исправить?

1 Ответ

0 голосов
/ 06 марта 2019

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

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

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

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

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