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

Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top