__declspec (dllimport / dllexport) e herança
Pergunta
Dada uma DLL com as seguintes classes:
#define DLLAPI __declspec(...)
class DLLAPI Base
{
public:
virtual void B();
};
class Derived : public Base
{
public:
virtual void B();
virtual void D();
};
A minha classe "derivada" ser visível fora da dll mesmo que a palavra-chave "DLLAPI" não é aplicada à definição de classe (pelo menos, não diretamente)? ??
É o "D ()" função visível para?
Graças
Solução
classe derivada não será exportado pelo seu DLL. Classes não herdam exportação. Adicionar DLLAPI para isso também.
Note também que os membros da classe padrão para acesso privado, de modo nenhum de seus métodos devem ser acessíveis. No entanto, eu ver Base de Dados :: B () sendo exportado no meu teste. O cabeçalho C ++ no código-usando DLL iria sinalizar o erro, mas eu me pergunto se você torceu o cabeçalho lá, se você poderia enganá-lo.
De qualquer forma, se você fez instanciar um Derivado dentro de sua DLL (através de outro ponto de entrada), a tabela virtual deve ainda trabalho, por isso, se você fez:
Base* b = getTheDerived(); b->B();
você invocar Derived :: B ().
Outras dicas
Você pode descobrir a partir de um shell de comando Visual Studio digitando
link /dump /exports <yourdll>
Se eles são exportados, você vai ver "nomes decorados" para as funções. Para ver o que eles estão em formato legível, copiar e colar um e fazer
undname <decorated name>
Não, derivada não será visível fora da DLL. Para exportar a classe derivada, você teria que aplicar a macro DLLAPI para classes derivadas também.
Você tem que fazer tanto a base e classes derivadas exportáveis,
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.