Какова область действия глобальных переменных внутри библиотек DLL C++


Предположим, что сторонняя DLL X имеет глобальную переменную G

Я пишу две отдельные библиотеки DLL (как плагины для приложения) P1 & P2 , которые оба динамически загружают X .

Процесс приложения загружает два моих плагина P1 & P2 таким образом, оба загружаются одновременно.

Означает ли это, что у меня есть один экземпляр G или два?

Редактировать:

Сценарий использования X - это 3D-рендеринг движок, который имеет синглетные оберточные системные ресурсы, просто не рассчитан на ожидание нескольких экземпляров в процессе - вы можете запустить 2 X -приложения одновременно, но попытка инициализировать X дважды в том же приложении будет испорчена. Плагины оба используют X , но будут развернуты как отдельные установщики, они будут не знать друг о друге и не будут совместно использовать один и тот же X.dll файл-как правило, каждый плагин будет иметь свой собственный dir для хранения необходимые ресурсы и библиотеки DLL.

2 4

2 ответа:

Процедуры загрузки DLL, представленные в Win32 API, гарантируют, что у вас есть только одна копия DLL, загруженная на процесс (смотрите раздел "Примечания" здесь , в частности, третий абзац и последний абзац перед разделом замечаний по безопасности, где обсуждается количество ссылок на процесс). Я предполагаю, что вы просто вызываете LoadLibrary или аналогичный, и в этом случае у вас есть один экземпляр G.

Представляется, что это возможно обойти, имея несколько копий Рассматриваемая библиотека DLL находится в разных местах (, Как отмечено в этом виде связанного вопроса), и загрузка каждой из них, в этом случае вы можете получить несколько копий всех данных в каждой библиотеке DLL (включая G).

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