У нас есть приложение, написанное на C / C ++, которое разбито на один EXE и несколько DLL. Каждая из этих DLL использует одну и ту же статическую библиотеку (utilities.lib
).
Любая глобальная переменная в статической библиотеке утилит фактически будет иметь несколько экземпляров во время выполнения в приложении. Будет одна копия глобальной переменной на каждый модуль (например, DLL или EXE), с которым был связан utilities.lib
.
(Все это хорошо известно, но стоит рассказать немного о том, как статические библиотеки ведут себя в контексте DLL.)
Теперь мой вопрос ... Мы хотим изменить utilities.lib
, чтобы он стал DLL. Он становится очень большим и сложным, и мы хотим распространять его в форме DLL, а не в форме .lib
. Проблема в том, что для этого приложения мы хотим сохранить текущее поведение, при котором каждая DLL приложения имеет собственную копию глобальных переменных в библиотеке утилит. Как бы вы это сделали? На самом деле нам это не нужно для всех глобальных переменных, только для некоторых; но это не имело бы значения, если бы мы получили его для всех.
Наши мысли:
- В библиотеке не так много глобальных переменных, которые нас интересуют, мы могли бы обернуть каждую из них аксессором, который выполняет какой-нибудь забавный трюк, пытаясь выяснить, какая DLL вызывает ее. Предположительно, мы можем пройти вверх по стеку вызовов и выудить
HMODULE
для каждой функции, пока не найдем ту, которая неutilities.dll
. Затем мы могли бы вернуть другую версию в зависимости от вызывающей DLL. - Мы могли бы поручить вызывающим абонентам установить определенную глобальную переменную (возможно, также локальную для потока) перед вызовом любой функции в
utilities.dll
. Затем DLL утилит может использовать это значение глобальной переменной для определения вызывающего контекста. - Мы могли бы найти способ загружать
utilities.dll
несколько раз во время выполнения. Возможно, нам нужно будет сделать несколько переименованных копий во время сборки, чтобы каждая DLL приложения могла иметь свою собственную копию DLL утилит. Это, в первую очередь, сводит на нет некоторые преимущества использования DLL, но есть и другие приложения, для которых такое поведение в стиле «статической библиотеки» не требуется и которые все равно выиграют, еслиutilities.lib
станетutilities.dll
.