С++ | Windows — передача объектов STL в DLL

Я видел несколько очень хороших вопросов, но решил задать свой, потому что это не совсем то, что я хотел знать.

Было много разговоров о том, что вы не должны передавать std::string в функцию (из DLL), потому что все должно соответствовать CRT, версии платформы и т. д., но можете ли вы безопасно передать const *char в функцию, а затем внутри .dll использовать std::string?

Причина, по которой я спрашиваю, заключается в том, что я недавно обнаружил, насколько удивительно полезны строки C++, и я хочу использовать их с моей .DLL, но я обнаружил, что их небезопасно использовать с .dll из-за шаблонов времени выполнения и тому подобного.

Итак, мой вопрос в основном заключается в том, существует ли «безопасный» способ использования std::string в .dll?


person Trevin Corkery    schedule 18.10.2016    source источник


Ответы (3)


Полностью безопасно использовать его внутрь.

И не слишком беспокойтесь об использовании std::string за границами DLL. Вы не можете использовать его в общедоступном интерфейсе, но когда вы отправляете DLL со своей собственной программой, вы контролируете обе стороны. Довольно часто и DLL, и EXE-файлы находятся в двух проектах Visual Studio в рамках одного решения VS. Это гарантирует, что они созданы с использованием одной и той же версии платформы и т. д.

person MSalters    schedule 18.10.2016

Не стесняйтесь использовать std::string в интерфейсе DLL. Но вы должны убедиться, что DLL и приложение должны быть созданы с одной и той же std библиотекой, чтобы избежать проблемы с std::string границами.

person Hieu Phan    schedule 18.10.2016

ABI не задокументирован, поэтому технически он может меняться в зависимости от версии компилятора и может зависеть от настроек компилятора.

Вы должны быть в безопасности, если вызывающий объект и DLL созданы одной и той же версией Visual C++.

Однако это означает: вы не можете использовать его в общедоступном интерфейсе, и вы отказываетесь от совместимости между версиями (скажем, запуская другой EXE с более новой DLL - после обновления вашего компилятора).

person peterchen    schedule 18.10.2016