Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Estado
subtletrue
colourGreen
titletlpp - language

Ao invocar uma DLL de interface C ou uma DLL de interface C++, o layout de assinatura é muito uniforme com DynCall.


Esse é o layout para uma DLL de interface C


E esse daqui é o layout para uma DLL de interface C++


Observe que ao chamar um método, logo após mencionar o tipo de retorno, obrigatoriamente será preciso também informar o objeto detentor do método.



Para que se possa entender com maior clareza, vamos considerar uma rotina de soma entre dois números de tipo double.
Em seguida, vamos admitir uma implementação em C e outra implementação em C++.

Bloco de código
languagecpp
firstline1
titleExemplo: layout C
double Add(double x, double y)
{
  return x + y;
}



Bloco de código
languagecpp
firstline1
titleExemplo: layout C++
class tArith
{
  public:
  
  tArith() { }


  double Add(double x, double y)
  {
    return x + y;
  }

  static tArith * factory()
  {
    return new tArith();
  }
};


Agora, vamos considerar que existam dois objetos de execução de DLL instanciados em TLPP.
O primeiro, oDll1, aponta para a DLL C. O segundo, oDll2, aponta para a DLL C++.


Bloco de código
languagecpp
firstline1
titleExemplo: assinatura de parâmetros (lado TLPP)
// chamando a função de uma DLL C
oDll1:CallFunction("Add", "DDD", nRet, nX, nY)

// antes de chamar o método Add da Dll2, vamos obter uma instância do objeto tArith.
oPointer := oDll2:newPointer()
oDll2:CallMethod("tArith::factory()", "P", oPointer)

// agora, podemos chamar o método Add
oDll2:CallMethod("tArith::Add(double,double)", "DPDD", nRet, oPointer, nX, nY)