Dinamicamente importar classe C ++ de uma DLL
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?
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.