В проекте Windows, мы определяем интерфейс классаDLL экспорта и виртуальные методы
class Interface {
public:
virtual ~Interface() { }
virtual void func() = 0;
};
и функция ФАБРИКА
__declspec(dllexport) Interface *construct();
внутри DLL. Конечно, в DLL существует конкретная специализация Interface
, но мы ее не экспортируем. Тем не менее мы можем использовать его вне DLL. Как это работает? vftable
экземпляра, созданного по construct()
, состоит из функций указателей, предназначенных для таргетинга, которые не экспортируются DLL. Является ли этот подход приемлемым или более или менее ручным?
Так что если COM никогда не экспортирует ничего, кроме заводской функции, это должно быть в значительной степени принятой техникой. – phlipsy
И макет v-таблицы происходит из общедоступного заголовка, который определяет интерфейс? – phlipsy
Да, грубо говоря, это компилятор, который строит его на основе объявления интерфейса. Довольно печально известный источник DLL Hell btw, управление версиями сложнее. Клиент, который использует более новое объявление интерфейса и случайно загружает старую версию DLL, сильно разрушится. Основная причина, по которой COM требует, чтобы вы всегда меняли интерфейс IID при его изменении. –