Pergunta

Plug-in de sistemas em C++ são difíceis porque a ABI não está devidamente definido, e cada um compilador (ou versão dele) que segue suas próprias regras.No entanto, COM o Windows mostra que é possível criar um mínimo de sistema de encaixe, que permite aos programadores com diferentes compiladores para criar plugins para um aplicativo de host usando uma interface simples.

Vamos ser práticos, e deixar o padrão de C++, o que não é muito útil, a este respeito, de lado, por um minuto.Se eu quiser escrever um aplicativo para Windows e Mac (e, opcionalmente, Linux) que suporta C++ plugins, e se eu quiser dar plug-in de autores razoavelmente grande variedade de compiladores (dizem que menos de 2 anos de idade versões do Visual C++, GCC ou Intel C++ compiler), que as características do C++ eu poderia contar?

Claro, eu suponho que os plugins iria ser escritas para uma plataforma específica.

Em cima da minha cabeça, aqui estão algumas C++ recursos que pode pensar, com o que eu acho que é a resposta:

  • vtable layout, usar objetos através de classes abstratas?(sim)
  • construído-em tipos de ponteiros?(sim)
  • estruturas, uniões?(sim)
  • exceções?(nenhum)
  • extern "C" de funções?(sim)
  • stdcall não extern "C" de funções com built-in de tipos de parâmetro?(sim)
  • não stdcall não extern "C" de funções com parâmetro definido pelo usuário tipos?(nenhum)

Gostaria muito de receber qualquer experiência que você tem nessa área que você pode compartilhar.Se você sabe de algum moderadamente bem-sucedido do aplicativo que tem um C++ plug-in do sistema, que é muito legal.

Carl

Foi útil?

Solução

Dr Dobb tem um artigo A Construção De Seu Próprio Plugin Framework:Parte 1 o que é muito bom ler sobre o assunto.É o início de uma série de artigos que aborda a arquitetura, o desenvolvimento e a implantação de um C/C++ multi-plataforma plugin framework.

Outras dicas

Você também pode querer considerar a substituição do convencional interface do plugin através de uma interface de script.Há muito boas ligações para várias linguagens de script em C/C++ que já resolveu o seu problema.Pode não ser uma má idéia para construir em cima deles.Por exemplo, ter um olhar para Impulso.Python.

Qt tem um bom sistema de plugins que eu usei no passado.Ele usa Qt meta-objeto do sistema para superar muitos dos problemas normalmente encontrados ao tentar desenvolver em C++ plugins.

Um exemplo é como Q_DECLARE_INTERFACE de obras, para impedir você de usar um plugin incompatível.Outro é o criar uma chave, para certificar-se de que você carregar o plugin correto para a sua arquitetura, sistema operacional, compilador.Se você não usar o Qt é um sistema de plugins, estas são coisas que você vai ter de se preocupar e a inventar soluções para o seu próprio.Não é necessariamente a ciência de foguetes, e eu não estou dizendo que você iria falhar, mas os caras do Trolltech são muito inteligentes e passei um tempo pensando sobre isso, e eu prefiro usar o que eles criados do que reinventar a roda a mim mesmo.

Outro exemplo é que RTTI normalmente não funciona em limites DLL, mas ao usar o Qt, coisas como qobject_cast que contam com o meta-objeto sistema de trabalho em limites DLL.

Eu acho que você está seguro criação de um sistema de plugin com base em:

  • Embalagem de funcionalidade do plugin em (biblioteca.dll .assim, etc.)
  • A exigência de que o plugin de expor a chave C-linguagem de exportações.
  • A exigência de que o plugin de implementar (e retornar um ponteiro/referência) um resumo C++ interface.

Provavelmente a mais bem sucedida C++ sistema de plugins:bom e velho Adobe Photoshop.E se não for isso, um dos sintetizador virtual formatos como VSTi etc.

O livro Imperfeito do C++ por Matthew Wilson tem uma boa informação sobre esta.

O conselho, no que parece ser:contanto que você usar o mesmo (ou equivalente) do compilador, você pode usar C++, caso contrário, você está melhor usando C como uma interface no topo do seu código C++.

ACE tem uma plataforma transversal arquitetura de plug-in.

Confira:

  1. ÁS DLL
  2. ÁS DLL Manager

Gostaria de sugerir conferir o livro
O ACE Guia do Programador

O Firefox é executado em XPCOM (http://www.mozilla.org/projects/xpcom/).Inspirada pela Microsoft COM, mas é multiplataforma.

Eu tenho o meu próprio motor de jogo que tem um C++ plug-in do sistema.

Tenho um código nos arquivos de cabeçalho, de modo que é posto em o plugin da unidade de compilação.

Maiores funções que vivem no principal mecanismo de chamados através de um exportados função C (plugin chama MyObject_somefunction(Meuobjeto *obj), que no motor, apenas chama obj->somefunction()).Se chamar uma função C é feio para o seu gosto, em seguida, com algumas cabeçalho de athena, quando o cabeçalho é incluído no plugin, tem a função de membro #definida para chamar a função C:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

Funções virtuais têm de ser puro ou o código vive no arquivo de cabeçalho.Se eu não estou herdando de uma classe e apenas uma instância de uma virtuais código de função pode viver no motor, mas, em seguida, a classe deve exportar algumas funções C para criar e destruir o objeto que é chamado de plugin.

Basicamente, os truques que eu usei, com o objetivo de manter uma total independência de plataforma, apenas a quantidade de C as exportações e o arquivo de cabeçalho truques.

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