Вопрос

Дана библиотека DLL со следующими классами :

#define DLLAPI __declspec(...)

class DLLAPI Base
{
    public:
    virtual void B();
};

class Derived : public Base
{
    public:
    virtual void B();
    virtual void D();
};

Будет ли мой "Производный" класс виден вне библиотеки dll, даже если ключевое слово "DLLAPI" не применяется к определению класса (по крайней мере, не напрямую)?

Видна ли функция "D()" для?

Спасибо

Это было полезно?

Решение

производный класс не будет экспортирован вашей библиотекой DLL.Классы не наследуют экспорт.Добавьте к этому еще DLLAPI.

Обратите также внимание, что члены класса по умолчанию имеют закрытый доступ, поэтому ни один из ваших методов не должен быть доступен.Тем не менее, я вижу, что Base::B () экспортируется в моем тесте.Заголовок C ++ в коде, использующем DLL, будет указывать на ошибку, но мне интересно, изменили ли вы там заголовок, сможете ли вы его обмануть.

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

Base* b = getTheDerived(); b->B();

вы бы вызвали Derived::B() .

Другие советы

Вы можете узнать это из командной оболочки Visual Studio, набрав

link /dump /exports <yourdll>

Если они будут экспортированы, вы увидите "оформленные имена" для функций.Чтобы увидеть, какие они в удобочитаемом формате, скопируйте и вставьте один из них и выполните

undname <decorated name>

Нет, производный не будет виден за пределами библиотеки DLL.Чтобы экспортировать производный класс, вам также придется применить макрос DLLAPI к производным классам.

Вы должны сделать экспортируемыми как базовый, так и производные классы,

http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

All base classes of an exportable class must be exportable. If not, a compiler 
warning is generated.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top