ИМХО, можно написать инлайновый алокатор который выделяет память при помощи ::CoTaskMemAlloc() и удаляет ::CoTaskMemkFree(), и тогда проблемм с кучами не будет. Можно ещё написать классик class SuperVector: public std::vector; который переорделаяет оператор new и себя тоже создаёт через ::CoTaskMemAlloc(). Я думаю что должно работать. Сам не пробовал.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, Аноним, Вы писали:
А>>>Здравствуйте, yxiie, Вы писали:
Y>>>>Здравствуйте, <Аноним>, Вы писали:
К>>>>>>Использовать рантайм Multithreaded DLL. А>>>>>собирается с /MTd
К>>>>>>Как вариант: откажись от вектора, передавай указатели на массивы. А>>>>>так массивы придется грохать опять же не в той длл в какой они были созданы или я чего не догоняю?
Y>>>>ну дак экспортируй из той длл также ф-цию MyDllFree А>>>это все ведет к тому, что возвращаемый вектор придется делать глобальным, а я этого делать не хочу
А>>никакой глобализации для этого не требуется. Просто сделай фабрику которая создает эти массивы функцией create и мочит их destroy и все. соответственно в экспортируемой функции DLLCreate вызывай у этого объекта create, а в DLLFree destroy
А>как я понял в библиотеке которая должна выдавать vector (в нашей терминологии длл1) будет жить некая сучность которая будет создавать вектор/массив, который далее будет возвращаться длл2 через вызов GetMenu, далее эта сучность будет грохать вектор/массив при выгрузке длл1? но тогда, по сути дела, эта сучность просто обертка вокруг вектора/массива, в чем преимущество, глобальный вектор/массив или вектор/массив с оберткой. к тому же длл1 должна экспортировать GetMenu в как можно более простом виде, идеальный вариант — GetMenu возвращающая вектор, это пользовательская библиотека, наворотов должно быть минимум
А>такой вопрос: сюда экспорт аллокаторов никак нельзя прикрутить, допустим передать аллокатор из длл2, в длл1 используя переданный аллокатор заполнить вектор и вернуть его а длл2?