Передача объектов STL и / или MFC между модулями - PullRequest
6 голосов
/ 23 сентября 2011

У меня довольно большая кодовая база, которая очень модульная (много-много плагинов), и очень часто нужно передавать строки и тому подобное между модулями.Для справки, код:

  • компилируется только в 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?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

DLL-библиотека расширения совместно использует DLL-библиотеку MFC с приложением и любыми другими DLL-библиотеками расширения, поэтому объекты могут свободно передаваться между ними. Возможно, Microsoft предусмотрела расширение DLL для реализации расширенных классов, но это не является обязательным требованием - вы можете использовать его любым способом.

Самая большая опасность стандартной библиотеки состоит в том, что большая часть ее основана на шаблонах. Это опасно, потому что, если DLL и приложение построены с разными версиями шаблонов, которые вы запускаете в соответствии с правилом единого определения, а неопределенное поведение кусает вас сзади. Это не просто инициализация или уничтожение объекта, но любая операция с объектом!

0 голосов
/ 24 сентября 2011

Вы можете объявить COM-подобные интерфейсы только для abstruct-метода и вместо этого передавать интерфейс. Например, напишите фабричный метод, такой как WMCreateReader , который создает объект (независимо от того, основывается ли он на MFC или имеет элементы STL, нет необходимости показывать его вызывающей стороне) и возвращает его интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...