Árvore de páginas

TLPP - LANGUAGE

  • CallMethod(cMethodName, cSignature, xRet, xParameters)
    • objetivo: chamar um método de uma uma DLL escrita em C++.
    • cMethodName: o protótipo completo do método que será chamado, incluindo nome da classe, nome do método e parâmetros (case-sensitive). Visite a seção DynCall - Protótipo C++.
    • cSignature: a assinatura do método (retorno e parâmetros). Veja a seção DynCall - Assinatura da chamada, que fala sobre assinaturas de funções e métodos.
    • xRet: uma variável para guardar o retorno do método. Se for método void, passe Nil.
    • xParameters: a lista de parâmetros do método chamado. Se o método não possuir parâmetros, essa lista só precisa conter o objeto do método a ser invocado.
    • retorno: lógico
      • .T.  execução com sucesso
      • .F.  execução com erro


O seguinte exemplo coloca lado a lado um código de uma biblioteca escrita em C++ e o código TLPP que carrega e executa o método add exportado pela classe tArith.

Do lado TLPP, observe que quando formos chamar um método de instância, como, por exemplo, o add, o primeiro parâmetro deve ser sempre o this do objeto. Nesse caso, ele é dado pela abstração mantida na variável oObj. Conforme convencionado, o this é um ponteiro e é legendado pela letra 'P'.

Exemplo: lado da biblioteca
#include <stdio.h>
#include <stdlib.h>

#define EXPORT __declspec(dllexport)

class EXPORT tArith
{
public:
  tArith();
  tArith* factory();
  int add(int a, int b);
};

tArith::tArith()
{
}

tArith* tArith::factory()
{
  tArith* p;
  p = new tArith();
  return p;
}

int tArith::add(int a, int b)
{
  return a + b;
}
Exemplo: lado TLPP
#include "tlpp-core.th"

Function U_DynCall()
  Local oDll as Object     // objeto de carga da dll
  Local nValue as Numeric  // guardar o retorno do método add
  Local oObj as Object     // abstração para uma instância de tArith da dll 

  If (IsSrvUnix())
    oDll := tRunDll():New("./dllcpp.so")
  Else
    oDll := tRunDll():New("dllcpp.dll")
  EndIf

  // criar uma abstração para algum objeto da dll
  oObj := oDll:NewObj()

  // o tArith::factory vai nos retornar um endereço que se vincula à abstração oObj
  oDll:CallMethod("tArith::factory()", "P", oObj)
  
  // agora a gente pode chamar o método add
  oDll:CallMethod("tArith::add(int, int)", "IPII", nValue, oObj, 11, 14)

  // terminou? vamos sanitizar o uso da dll
  oDll:FreeObj(oObj)
  oDll:Free()
  
  // espera-se o valor 25
  Conout(nValue)
Return
  • Sem rótulos