Статическая библиотека «запускается» и «заканчивается», когда программа, частью которой она является, запускается и заканчивается.
Я помещаю слова «начинается» и «заканчивает» в кавычки, потому что после того, как приложение связано, в нем нет статической библиотеки как таковой. Функции из статической библиотеки неотличимы от функций из приложения.
Итак, если у вас есть вещи, которые необходимо сделать перед вызовом какой-либо функции в определенной статической библиотеке, вы должны создать функцию инициализации и явно вызвать ее из своего кода, например, от вашей main()
функции. Точно так же, если у вас есть вещи, которые необходимо выполнить после того, как вы закончили использовать функции из статической библиотеки, вы должны создать функцию очистки и явно вызывать ее из своего кода. Это на самом деле довольно нормальная практика.
Подумайте также о том, чтобы изменить свою DLL так, чтобы вам пришлось выполнять инициализацию в явном виде точно таким же образом. Это имеет пару преимуществ:
- Вам не нужно менять код приложения, если вы изменяете способ связывания библиотеки
- То, что вы можете сделать в
DLLMain
, довольно ограничено. Даже все функции в DLL ядра безопасны для вызова. Это не относится к явной функции инициализации, вызываемой после загрузки DLL.