C ++ DLL плагин интерфейс - PullRequest
       24

C ++ DLL плагин интерфейс

5 голосов
/ 21 января 2011

Я планирую сделать интерфейс плагина C ++ ala Как создать некоторый класс из dll (конструктор в dll)? (С ++) но были высказаны опасения, что если интерфейс используется для создания DLL через MinGW или Borland, а загрузчик DLL скомпилирован с MSVC ++, могут возникнуть проблемы. Поскольку единственная экспортируемая функция объявлена ​​extern "C", я не понимаю, почему она не будет работать?

Идеи?

Ответы [ 2 ]

11 голосов
/ 21 января 2011

Если вы хотите быть совместимыми между компиляторами (и Release / Debug) и использовать C ++, вам нужно немного больше усилий.

По сути - вам разрешено передавать базовые типы данных и указывать на чисто виртуальные классы,Эти классы не должны содержать никаких элементов данных, их деструктор не должен быть публичным, и у них не должно быть перегруженных функций.

Запрещается выделять память в одной dll и освобождать в другой.Это означает отсутствие исключений, и вам нужен какой-то механизм подсчета или возврата ссылок.

Все методы внутри чисто виртуального класса (он же «Интерфейс») должны быть помечены соглашением о вызовах (я бы предпочел stdcall).

Динамическое приведение также невозможно, поэтому вам может потребоваться некоторая функциональность во всех ваших интерфейсах для выполнения этой задачи (например, QueryInterface в COM).

Это работает, потому что большинство компиляторов на win32 стараются бытьСовместимость с COM и решение тех же проблем совместимым с COM способом.Для получения первого интерфейса вам нужна простая функция C, которая экспортируется из dll.

Если вы просто используете функции C и типы данных C, все будет работать также.Но тогда вы ограничены C без классов и наследования.

Надеюсь, это поможет.


Искажение имен не является проблемой:

1st: если вы используетеФункции C с типами данных C, все определено, нет искажения имен (исключение: в VS с STDCALL вам необходимо переназначить имя на «нормальное» имя C с помощью директивы Linker)

2nd: методы внутриклассы не экспортируются и, следовательно, не искажаются.Вы вызываете методы через указатель на чисто виртуальные классы (также называемые «Интерфейсы»).Это использует смещение и без имени.Вы по-прежнему не можете использовать деструктор, поскольку, насколько я знаю, положение деструктора внутри vtbl не является фиксированным.


Если вы передаете структуры функциям / методам, обязательно исправьтевыравнивание.Он не определен для разных компиляторов.

0 голосов
/ 21 января 2011

Идея может заключаться в использовании стандартной функции extern C для создания ClassFactory. Имейте некоторое соглашение о фиксированной (или более) точке входа, которую dll должна предоставить в качестве действительного плагина.

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