DLL, используемая программой, где хранятся объявленные в ней переменные? - PullRequest
2 голосов
/ 09 июня 2011

У меня есть программа (не моя, у меня нет исходного кода), которая предоставляет интерфейс, чтобы я мог написать DLL, которая будет вызываться моей программой.Теперь мне стало интересно, когда я объявлю какую-нибудь переменную в этой DLL, которую я создаю, в каком пространстве памяти это будет храниться?

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

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

DLL загружается один раз за процесс .Когда-то DLL были разделены между процессами, но этого не произошло, поскольку Windows 3.1 пошла по пути додо.

Любые глобальные переменные, которые вы объявляете в вашей DLL, будут храниться на странице данных.,Обратите внимание: страница, отличная от глобальных переменных EXE-файла.

Теперь, если вы выделите память в куче, то, будут ли ваши выделения смешаны с EXE-файлами, зависит от того, какую кучу вы используете.Если и EXE, и DLL используют одну и ту же среду выполнения, связанную как DLL, они оба получат память из одной и той же кучи.Если они имеют разные среды выполнения или статически связываются со средой выполнения, они получат разные кучи.Это превращается в очень большую банку с червями, поэтому я не буду идти дальше.

1 голос
/ 09 июня 2011

Ваша DLL объявит DllMain, который эквивалентен точке входа в обычном исполняемом файле.Когда ваша DLL загружена, вызывается ваша DLLMain. Здесь - это ссылка на лучшие практики того, что там должно быть сделано.

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

Предположительно исполняемые интерфейсы, загружая вашу DLL и вызывая в ней некую экспортированную функцию.В основном все, что вы делаете после загрузки вашей DLL, будет находиться в пространстве памяти процесса, в который она загружена.

Если вы хотите узнать больше о том, что именно происходит при загрузке вашей DLL, вам следует посмотретьсемантика LoadLibrary () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...