Pergunta

O que é a maneira correta de importar uma classe C ++ de uma DLL? Estamos usando Visual C ++.

Há o dllexport / exports.def + LoadLibrary + GetProcAddress trio, mas não funciona em classes C ++, apenas funções C. É este, devido à C ++ nome-mangling? Como posso fazer este trabalho?

Foi útil?

Solução 2

Encontrada a solução em http://www.codeproject.com/KB/DLL/ XDllPt4.aspx

Obrigado por seus esforços rapazes e raparigas

Outras dicas

Você precisa adicionar o seguinte:

extern "C"
{
...
}

para evitar função mangling.

você pode considerar escrever duas funções simples C:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

Por apenas usando essas funções pode depois adicionar / funcionalidade de alteração de sua criação do objeto / exclusão. Isso às vezes é chamado de fábrica.

Eu normalmente declarar uma classe base de interface, use esta declaração no meu aplicativo, em seguida, usar LoadLibrary, GetProcAddress para obter a função de fábrica. O fator sempre retorna ponteiro do tipo de interface.

Aqui está um exemplo prático, exportar um MFC documento / vista de uma DLL , carregado dinamicamente

Confira esta questão . Basicamente, existem duas maneiras. Você pode marcar a classe usando _dllexport e, em seguida, ligar com a biblioteca de importação, ea DLL será carregado automaticamente. Ou se você quiser carregar a DLL dinamicamente, você pode usar a ideia de função de fábrica que @titanae sugeriu

dllexport / dllimport obras, que antes de seu nome da classe no arquivo de cabeçalho e você está pronto para ir.

Normalmente, você quer usar dllexport na dll, e dllimport no exe (mas você pode apenas usar dllexport em todos os lugares e funciona, fazê-lo 'direito' torna tinily mais rápido para carregar).

Obviamente que é para a compilação link-tempo. Você pode usar / DELAYLOAD vinculador directiva para torná-lo 'dinâmico', mas isso não é provavelmente o que você quer da linha de assunto.

Se você quiser realmente uma carga estilo LoadLibrary, você vai ter que quebrar suas funções de C ++ com invólucros "extern C". O problema é por causa da desconfiguração do nome, você pode digitar o nome totalmente mutilado e ele iria trabalhar.

As soluções são geralmente para fornecer uma função C que retorna um ponteiro para a classe correcta - COM funciona desta maneira, uma vez que exporta 4 funções C a partir de uma dll que são utilizados para obter os métodos de interface dentro do objecto na dll.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top