Почему некоторые библиотеки VB6 загружаются как сопоставленные файлы? - PullRequest
0 голосов
/ 23 апреля 2010

Мой коллега, пытаясь выяснить использование памяти нашим приложением VB6 / C # 2.0, заметил, что меньшинство библиотек VB6 имеют две записи в приложении SysInternals Process Explorer. Все библиотеки DLL имеют запись для Mapping = Image и указанный базовый адрес. Однако у некоторых также есть запись для Mapping = Data с базовым адресом ноль и гораздо меньшим использованием памяти. Кажется, я кое-что помню об использовании файлов отображенной памяти для разделения памяти между процессами, но мы определенно не делаем что-то столь же интересное, как это. Вся связь между EXE-файлами осуществляется через COM, и, насколько я знаю, никто не написал компонент общей памяти.

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

Спасибо

Марк Бертеншоу

Ответы [ 4 ]

1 голос
/ 23 апреля 2010

Это было слишком давно, но я помню, что нативная модель выполнения для Visual Basic интерпретировалась как P-код. Где-то в эпоху VB4 он начал поддерживать компиляцию в машинный код. В основном, чтобы оставаться конкурентоспособным с Delphi Borland, IIRC.

P-код будет загружен в виде данных и гораздо более компактен, чем машинный код. И намного медленнее. Машинный код будет загружен как любая DLL в Windows, страница с отображением в памяти приводит к сбою кода в памяти.

0 голосов
/ 27 апреля 2010

Добавьте еще одно дикое предположение:

Возможно ли, что некоторые из этих файлов PE были связаны с использованием параметра / SWAPRUN?

Параметр / SWAPRUN сообщает операционная система, чтобы сначала скопировать вывод компоновщика в файл подкачки, а затем запустить изображение оттуда. Это Функция Windows NT 4.0 (и более поздние версии).

Если указан NET, операционная Система сначала скопирует двоичный файл изображение из сети в файл подкачки и загрузить его оттуда. Эта опция полезно для запуска приложений сеть. Когда указан CD, операционная система скопирует образ на съемном диске в файл подкачки и затем загрузите его.

0 голосов
/ 26 апреля 2010

Могут ли отображаемые в памяти DLL быть DLL, в которые встроены ресурсы? Я не уверен, как Windows (или VB6, в этом отношении) обычно работает с ресурсами в DLL, но мне интересно, являются ли DLL, которые были явно скомпилированы с файлом .res в VB6, те, которые появляются дважды.

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

0 голосов
/ 23 апреля 2010

Просто предположение, но есть ли в ваших библиотеках переменные Public или Global, объявленные в модулях BAS? Если это так, они совместно используются всеми объектами в вашей DLL, и они могут храниться в области данных?

Еще более дикая догадка. Используете ли вы XP, и эти библиотеки DLL получают rebase , когда EXE загружает их? (Вы можете попросить Process Explorer выделить перебазированные библиотеки DLL другим цветом). Вы можете предотвратить перебазирование, изменив базовый адрес . Это заставит библиотеки DLL загружаться быстрее, даже если это не объясняет небольшую область памяти.

...