Frage

eine DLL mit den folgenden Klassen Gegeben:

#define DLLAPI __declspec(...)

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

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

Wird meine „Abgeleitet“ Klasse sichtbar außerhalb der DLL sein, auch wenn das „DLLAPI“ Schlüsselwort nicht auf die Klassendefinition angewandt wird (zumindest nicht direkt)?

Ist der "D ()" Funktion sichtbar?

Danke

War es hilfreich?

Lösung

Klasse abgeleitet wird nicht von der DLL exportiert werden. Klassen erben nicht exportieren. In DLLAPI zu diesem zu.

Hinweis zu, dass die Teilnehmer standardmäßig privat Zugänglichkeit, so dass keiner Ihrer Methoden sollte zugänglich sein. Aber ich sehe Basis :: B () in meinem Test exportiert. Die C ++ Header in der DLL-Code mit moniert der Fehler, aber ich frage mich, ob Sie die Header dort gezwickt, wenn Sie es täuschen kann.

Wie auch immer, wenn Sie ein in Ihrem DLL hat instanziiert Abgeleitete (über einen anderen Zugangspunkt) sollte die virtuelle Tabelle immer noch funktionieren, wenn Sie also tat:

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

würden Sie Derived :: B () aufrufen.

Andere Tipps

Sie können aus einem Visual Studio-Befehls-Shell finden Sie heraus, indem Sie

link /dump /exports <yourdll>

Wenn sie ausgeführt werden, werden Sie „ergänzte Namen“ für die Funktionen sehen. Um zu sehen, was sie in lesbarer Form ist, copy-paste ein und tut

undname <decorated name>

Nein, Abgeleitet wird nicht sichtbar außerhalb der DLL sein. Um die abgeleitete Klasse zu exportieren, würden Sie auch die DLLAPI Makro abgeleiteten Klassen gelten müssen.

Sie müssen sowohl die Basis- und abgeleiteten Klassen exportierbar machen,

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top