Могу ли я передать std :: string в DLL? - PullRequest
9 голосов
/ 18 марта 2011

Я разделил фрагмент кода на DLL, потому что он будет часто обновляться, и таким образом его будет проще развернуть.

Но у меня есть вопросы о том, что я могу сделать, а что нетс DLL.

  1. Могу ли я передать std:string или CString на DLL?
  2. Могу ли я передать указатель на struct с помощью std::string members и заполнить его DLL?
  3. Может ли DLL вернуть указатель на размещенную там структуру?Это будет действительным?Могу ли я удалить его после?
  4. Что лучше передать, std::String или Cstring?

Спасибо!

Ответы [ 2 ]

22 голосов
/ 18 марта 2011

У вас есть выбор:

  • Тесно связанная DLL: DLL построена с точно такой же версией компилятора, настройками соглашения об упаковке и вызове, опциями библиотеки в качестве приложения и обе динамически связаны с библиотекой времени выполнения (опция компилятора /MD). Это позволяет передавать объекты туда и обратно, включая контейнеры STL, выделять объекты DLL изнутри приложения, наследовать от базовых классов в другом модуле, делать практически все, что можно, без использования DLL. Недостатком является то, что вы больше не можете развертывать DLL независимо от основного приложения. Оба должны быть построены вместе. DLL предназначена только для того, чтобы улучшить время запуска процесса и рабочий набор, потому что приложение может запуститься до загрузки DLL (с ​​помощью опции компоновщика /delayload). Время сборки также меньше, чем у одного модуля, особенно когда используется оптимизация всей программы. Но оптимизация не происходит за границей приложения-DLL. И любое нетривиальное изменение все еще потребует восстановления обоих.

  • Слабосвязанное: приложение не зависит от макета класса объектов, определенных DLL. Вы используете только очень совместимые типы данных: примитивные типы, указатели, указатели функций и определяемые пользователем типы, состоящие из этих элементов. Классы наследуются от базового класса, который определяет интерфейс и не имеет элементов данных и не виртуальных функций (это означает, что нет конструкторов и нет общего доступа к стандартным объектам библиотеки, таким как std::string или CString). Все выделение и создание объекта должны выполняться через фабричную функцию. Память должна быть освобождена от модуля, который ее выделил. Код и данные разделены. Заголовочный файл явно устанавливает соглашение о вызовах каждой экспортируемой функции и упаковку каждой структуры, разрешенной для пересечения границ модуля. Преимущество заключается в том, что DLL и приложение могут обновляться совершенно независимо. Вы можете перестроить его с помощью новой библиотеки времени выполнения, новой версии компилятора или даже на совершенно новом языке, и вам даже не нужно прикасаться к другому.

Я всегда советую использовать слабосвязанный подход.

3 голосов
/ 18 марта 2011

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

В случае строки я передам const char * (или const wchar_t * или const TCHAR *) и выполню преобразование в std::string или CString на другой стороне интерфейса в DLL .

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