2009-08-12 7 views
5

Учитывая DLL со следующими классами:__declspec (DllImport/dllexport) и наследование

#define DLLAPI __declspec(...) 

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

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

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

Является ли функция «D()» видимой?

Благодаря

ответ

4

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

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

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

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

вы бы вызвать Derived :: B ().

3

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

link /dump /exports <yourdll> 

Если они экспортируются, вы увидите «декорированные имена» для функций. Для того, чтобы увидеть, что они находятся в удобочитаемом формате, скопируйте и вставьте один и сделать

undname <decorated name> 
1

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