Если вы хотите быть совместимыми между компиляторами (и Release / Debug) и использовать C ++, вам нужно немного больше усилий.
По сути - вам разрешено передавать базовые типы данных и указывать на чисто виртуальные классы,Эти классы не должны содержать никаких элементов данных, их деструктор не должен быть публичным, и у них не должно быть перегруженных функций.
Запрещается выделять память в одной dll и освобождать в другой.Это означает отсутствие исключений, и вам нужен какой-то механизм подсчета или возврата ссылок.
Все методы внутри чисто виртуального класса (он же «Интерфейс») должны быть помечены соглашением о вызовах (я бы предпочел stdcall).
Динамическое приведение также невозможно, поэтому вам может потребоваться некоторая функциональность во всех ваших интерфейсах для выполнения этой задачи (например, QueryInterface в COM).
Это работает, потому что большинство компиляторов на win32 стараются бытьСовместимость с COM и решение тех же проблем совместимым с COM способом.Для получения первого интерфейса вам нужна простая функция C, которая экспортируется из dll.
Если вы просто используете функции C и типы данных C, все будет работать также.Но тогда вы ограничены C без классов и наследования.
Надеюсь, это поможет.
Искажение имен не является проблемой:
1st: если вы используетеФункции C с типами данных C, все определено, нет искажения имен (исключение: в VS с STDCALL вам необходимо переназначить имя на «нормальное» имя C с помощью директивы Linker)
2nd: методы внутриклассы не экспортируются и, следовательно, не искажаются.Вы вызываете методы через указатель на чисто виртуальные классы (также называемые «Интерфейсы»).Это использует смещение и без имени.Вы по-прежнему не можете использовать деструктор, поскольку, насколько я знаю, положение деструктора внутри vtbl не является фиксированным.
Если вы передаете структуры функциям / методам, обязательно исправьтевыравнивание.Он не определен для разных компиляторов.