2013-06-11 2 views
1

В проекте Windows, мы определяем интерфейс классаDLL экспорта и виртуальные методы

class Interface { 
public: 
    virtual ~Interface() { } 
    virtual void func() = 0; 
}; 

и функция ФАБРИКА

__declspec(dllexport) Interface *construct(); 

внутри DLL. Конечно, в DLL существует конкретная специализация Interface, но мы ее не экспортируем. Тем не менее мы можем использовать его вне DLL. Как это работает? vftable экземпляра, созданного по construct(), состоит из функций указателей, предназначенных для таргетинга, которые не экспортируются DLL. Является ли этот подход приемлемым или более или менее ручным?

ответ

3

Просто не нужно экспортировать конкретный класс. V-таблица, которую вы получаете от указателя интерфейса, будет установлена ​​на конкретную v-таблицу, хранящуюся внутри DLL. У которого уже есть все указатели на функции, правильно установленные для методов реализации. Итак, как только вы получили указатель v-table, тогда вы золотистый и можете вызвать любой из конкретных методов. Сравните с COM, вы никогда не экспортируете ничего с COM-сервера, кроме заводской функции (DllGetClassObject).

do необходимо экспортировать функцию construct(), нет другого способа, которым внешний код может получить адрес этой функции. Требуется таблица поиска, которая сопоставляет имя функции с адресом функции. Таблица экспорта DLL. Экспорт функций и классов добавляет записи в эту таблицу экспорта.

+0

Так что если COM никогда не экспортирует ничего, кроме заводской функции, это должно быть в значительной степени принятой техникой. – phlipsy

+0

И макет v-таблицы происходит из общедоступного заголовка, который определяет интерфейс? – phlipsy

+0

Да, грубо говоря, это компилятор, который строит его на основе объявления интерфейса. Довольно печально известный источник DLL Hell btw, управление версиями сложнее. Клиент, который использует более новое объявление интерфейса и случайно загружает старую версию DLL, сильно разрушится. Основная причина, по которой COM требует, чтобы вы всегда меняли интерфейс IID при его изменении. –

 Смежные вопросы

  • Нет связанных вопросов^_^