2009-08-12 14 views
5

Data una DLL con le seguenti classi:__declspec (dllimport/dllexport) ed eredità

#define DLLAPI __declspec(...) 

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

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

Sarà la mia classe "derivata" essere visibile al di fuori del dll, anche se la parola "DLLAPI" non si applica al definizione di classe (almeno, non direttamente)?

È visibile la funzione "D()"?

Grazie

risposta

4

classe Derivato non verrà esportato dalla DLL. Le classi non ereditano l'esportazione. Aggiungi DLLAPI anche a questo.

Nota anche che i membri della classe hanno un'impostazione predefinita per l'accessibilità privata, quindi nessuno dei tuoi metodi deve essere accessibile. Tuttavia, vedo Base :: B() che viene esportato nel mio test. L'intestazione di C++ nel codice che utilizza DLL potrebbe segnalare l'errore, ma mi chiedo se l'intestazione sia stata ottimizzata, se fosse possibile ingannarla.

In ogni caso, se avete un'istanza di un Derivato all'interno del vostro DLL (attraverso un altro punto di ingresso), la tabella virtuale dovrebbe funzionare, quindi se avete fatto:

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

che ci si richiama Derived :: B ().

3

È possibile scoprire da una shell dei comandi di Visual Studio digitando

link /dump /exports <yourdll> 

Se sono esportati, si vedrà "nomi decorati" per le funzioni. Per vedere quello che sono in un formato leggibile, copiare e incollare uno e fare

undname <decorated name> 
1

No, derivato non sarà visibile al di fuori della DLL. Per esportare la classe derivata, dovresti applicare la macro DLLAPI anche alle classi derivate.