Здравствуйте, kosmas, Вы писали:
K>А здравствуйте.
K>Есть ПО, написаное на борланде с++ (2006, вроде), и длл на MSVS2010.
K>Dll-ка при работе может выпрашивать себе (new) до 600-700 МБ блоками по 2-4 МБ. Также известно, что само ПО может запрашивать столько же или меньше. Цифры примерные, но, в общей сложности, в сумме не превышают 1.2-1.3 ГБ. Процесс 32бит. У длл /MT.
K>Так вот, если длл-ку подключать к тестовому проекту MSVS — память выделяется, все работает, жизнь хороша.
K>Если же ее подключать к вышеупомянутому ПО, то dll начинает кидать bad_alloc еще не успев запросить и 200 МБ из любых new, будь то тот самый 2МБ блок или push_back совсем скромного вектора.
K>Есть ли в этой связи какие-то общеизвестные факты? Да и вообще, что делать-то, как их подружить?
Похоже, куча приложения и куча дллки передрались за адресное пространство.
На всякий случай начну сначала, чтобы потом не возвращаться.
Куча — некий системный пул памяти, из которого в дальнейшем берутся блоки памяти на нужды приложения.
В винде куча описывается дескриптором, и в приложении их может быть несколько штук.
С++ runtime выделяет при запуске приложения одну такую кучу, из которой потом берут память malloc и new. По сути, это просто глобальная переменная, со всеми своими плюсами и минусами. Как Вы понимаете, если ваши приложение и длл линкуются даже с разными инстансами рантайма, куч получается две штуки. Просто потому что каждый модуль сам держит свои статические данные. И за адресное пространство приложения у них может случиться драка. Примерно как при фрагментации обычной кучи.
Есть несколько способов решить проблему:
1. Линковать обоих пациентов с одним рантаймом. Правда, я не в курсе, с каким рантаймом линковался борланд. Если там тоже статика, а исходников чтобы пересобрать нету, скорее всего дохлый номер.
2. Попытаться заставить софтину юзать 3гб, а не 2. Но для этого надо иметь и приложение, и длл, собранные с этим ключом (вроде можно подхачить готовый бинарь), и ось запускать с определённым ключиком.
3. Плюнуть на всё, написать прокси-длл с интерфейсом нужной, которая будет стартовать отдельный процесс и общаться с ним каким-л. способом, маршаля параметры и результаты туда-сюда. Для этого можно попробовать COM outproc server как готовую инфраструктуру. Если подхачить манифест, не прийдётся регистрировать в глобальной свалке.
В общем, удачи