Какова область применения глобальных переменных внутри C ++ DLL - PullRequest
4 голосов
/ 05 февраля 2011

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

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

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

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

редактирование:

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

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

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

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

0 голосов
/ 05 февраля 2011

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

...