2009-04-20 8 views
4

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

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

Есть ли способ обхода этого? как работает загрузчик окон?

Спасибо, Velu

+0

Есть ли шанс, что это приложение в смешанном режиме? Если это так, то, если у вас также есть несколько AppDomains, тогда можно загрузить одну и ту же DLL, но в каждом AppDomain. –

+0

Я видел это раньше, когда один раз отображался как «Изображение», а другой как «Данные» на разных базовых адресах и размерах. – paulm

ответ

0

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

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

0

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

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

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

1

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

+0

Hi Micheal. Удивительно, что оба экземпляра загружаются с одного и того же пути, а DLL_PROCESS_ATTACH - это то, что я имел в виду to .. – atVelu

+0

Разве DLL разгружается между ними? Можете ли вы отправить код на свой DllMain? – Michael

1

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

0

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

Смежные вопросы