Árvore de páginas

TLPP - LANGUAGE

  • NewObj(nBytes)
    • objetivo: criar uma área de dados opaca para armazenar uma instância de um objeto da DLL. Esse método deve ser chamado imediatamente antes de invocarmos o construtor de um objeto.
    • nBytes:  o sizeof desse objeto (é opcional).
    • Retorno:
      • um objeto opaco que referencia um endereço na DLL.
      • este retorno é do tipo object em TLPP.



Considerando o lado esquerdo do seguinte exemplo, uma aplicação poderia obter um objeto tArith de duas formas: pelo factory ou realizando um "new tArith()".
Em TLPP, as duas formas são possíveis com DynCall.

No primeiro caso, é criada uma abstração simples, indicando tão e somente que será associado um objeto de DLL em uma chamada posterior.
O endereço do objeto é fornecido por alguma função ou método estático da DLL, como o factory, no exemplo.

No segundo, a aplicação TLPP vai fazer o "new tArith()" e, portanto, precisará indicar um tamanho explícito que comporte suficientemente um objeto tArith.
Em seguida, ela chama o construtor da DLL.

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

#define EXPORT __declspec(dllexport)

class EXPORT tArith
{
public:
  tArith();
  tArith* factory();
};

tArith::tArith()
{
}

tArith* tArith::factory()
{
  tArith* p;
  p = new tArith();
  return p;
}
Exemplo: lado TLPP
#include "tlpp-core.th"

Function U_DynCall()
  Local oDll as Object                 // objeto de carga da dll
  Local oObjCase1 as Object            // abstração para instância tArith
  Local oObjCase2 as Object            // outra abstração tArith
  Local nSizeOfArith := 64 as Numeric  // um tamanho que caiba um tArith

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

  // caso 1: TLPP não aloca, só recebe um objeto pronto
  oObjCase1 := oDll:NewObj()
  oDll:CallMethod("tArith::factory()", "P", oObjCase1)       

  // caso 2: TLPP vai alocar um espaço de memória e depois chamar o construtor
  oObjCase2 := oDll:NewObj(nSizeOfArith)    // tamanho em bytes a alocar 
  oDll:CallMethod("tArith::tArith()", "VP", nil, oObjCase2)
 
  // terminou? vamos sanitizar o uso da dll
  oDll:FreeObj(oObjCase1)
  oDll:FreeObj(oObjCase2)
  oDll:Free()
  
Return
  • Sem rótulos