Я знаю, почему вы хотите избежать COM.Согласен.Таким образом, один оставленный вариант на самом деле является чистым C-интерфейсом вашей dll.И вам действительно нужно позаботиться о том, чтобы придерживаться чистой связи C (extern "C"
объявление).
Если вы экспортируете классы со связью C ++ для вашей dll, компилятору потребуется сгенерировать искаженные имена для экспортируемых символов.Генерация этих искаженных имен зависит от версии и компилятора.Таким образом, на самом деле это означает, что вам нужно развернуть вашу dll для всех поддерживаемых версий компилятора.
искажение имени не является частью стандарта C ++ и, следовательно, несовместимо между поставщиками компилятора и иногда даже междуВерсии компилятора того же производителя.
Еще одна вещь, которую следует помнить, это то, что вам будет еще труднее, если вы планируете использовать типы STL в интерфейсе вашей dll.Подробнее см. Контейнеры STL и двоичный интерфейс .
Назад к интерфейсу C
Поскольку мы столкнулись с той же проблемой в нашемКоманда, мы решили пойти на проект dll, имеющий:
- ... a
C
интерфейс и - ... отдельный фасад библиотекав сопровождении
Библиотека фасад может быть либо статической библиотекой, скомпилированной в среде сборки dll-потребителя, либо библиотекой только с заголовками.В любом случае это очень тонкая оболочка вокруг хрупкого C
интерфейса библиотеки DLL и может пересылать более объектно-ориентированный дизайн.По крайней мере, то, что делает:
- Группирует связанные функции с классами.
- Преобразует коды ошибок в исключения.
- Преобразует типы STL (строки, векторы и т. Д.)) к собственным типам (const char *, void *, длина буфера и т. д.)
Таким образом, мы могли бы сохранить преимущество версий dll, имеющих совместимый интерфейс и отсутствие необходимости (слишком) много заботысреды пользователя.