У меня довольно большая кодовая база, которая очень модульная (много-много плагинов), и очень часто нужно передавать строки и тому подобное между модулями.Для справки, код:
- компилируется только в MSVC / Visual Studio, и очень явно не поддерживает и не будет поддерживать другие компиляторы.Их поддержка не является проблемой.
- работает только в Windows, и совершенно очевидно, что не поддерживает и не будет поддерживать другие ОС.То же, что и выше.
- все модули будут Windows PE некоторого вида;Предположим, что они одинаковы и что они созданы для одной и той же платформы.
- Есть несколько мест, где проще использовать MFC, и несколько мест, где есть STL.Существует очень хороший шанс, что оба будут использоваться в каждом модуле.
- Вопрос только относительно проходящих объектов между модулями.
Теперь у меня сложилось впечатление, что передача объектов STL между модулями может действительно прерваться, если изменится версия библиотеки или компилятора.Особенно, когда речь идет о дторах и уничтожении объектов вне модуля / версии, в которой они были созданы.
Насколько безопаснее в этом случае MFC?Можете ли вы безопасно передать объект MFC (например, CString
) из Base.dll в Plugin.dll?Вам нужно передать указатель, вы не можете безопасно удалить его из плагина?
Имеет ли значение, если MFC статически связан или используется из DLL?
MSDN упоминается в нескольких местахчто:
Все выделения памяти в обычной DLL должны оставаться внутри DLL;DLL не должна передавать или получать от вызывающего исполняемого файла любое из следующего:
- указатели на объекты MFC
- указатели на память, выделенную MFC
Если вам нужно выполнить что-либо из вышеперечисленного или передать объекты, производные от MFC, между вызывающим исполняемым файлом и библиотекой DLL, необходимо создать расширение DLL.
Однако библиотеки расширения страницы упоминают, что они предназначены в основном для реализованных объектов, полученных из объектов MFC.Я не заинтересован в том, чтобы делать это, просто используя их и передавая между различными модулями.
Изменяет ли передача shared_ptrs что-либо (или класс с виртуальным dtor)?
Есть ли решение для этого?не прибегая к типам C?