Одна и та же DLL загружена дважды в процессе - PullRequest
5 голосов
/ 20 апреля 2009

У меня есть элемент управления ActiveX (foo.dll), когда я встраиваю его в IE и запускаю страницу. Я мог видеть, что проводник процесса показывает два экземпляра файла foo.dll, загруженного из одного места.

Это приводит к тому, что DLL_PROCESS_ATTACH вызывается дважды, а глобальные структуры данных инициализируются дважды.

Есть ли способ обойти это? как работает загрузчик windows?

Спасибо, Велит

Ответы [ 5 ]

1 голос
/ 21 апреля 2009

LoadLibraryEx содержит дополнительный флаг о том, как обращаться с DLL. Я подозреваю, что именно поэтому вы видите это несколько раз.

1 голос
/ 20 апреля 2009

DLL_PROCESS_ATTACH следует вызывать только один раз для каждого экземпляра DLL. , , загружаются ли DLL по одному и тому же базовому адресу, то есть HINSTANCE в DllMain одинаковы? Они загружены с одного и того же пути? Различные пути приводят к различным загруженным модулям. Разгружается ли он между двумя нагрузками? Вы уверены, что видите DLL_PROCESS_ATTACH, а не DLL_THREAD_ATTACH?

0 голосов
/ 11 июля 2012

Я не уверен, но я думаю, что наблюдение может быть объяснено тем фактом, что dll, на которую вы ссылаетесь, создает экземпляр объекта COM (ActiveX), который определен как STA (однопотоковая квартира). Любая DLL-библиотека .Net, ссылающаяся на com-объект STA, будет загружать в память новое изображение для каждого потока, использующего эти COM-объекты. По крайней мере, именно такое поведение нам и кажется.

0 голосов
/ 20 апреля 2009

DLL_PROCESS_ATTACH вызывается всякий раз, когда процесс загружает DLL.

Используйте счетчик, чтобы определить, сколько процессов подключено, и инициализируйте только тогда, когда подключен первый.

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

0 голосов
/ 20 апреля 2009

Одним из обходных путей является защита глобальных данных с помощью функции инициализации синглтон-иш.

Сколько у вас глобальных структур?

...