Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 5 Próxima »

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 uma instância de tArith da dll     
  Local oObjCase2 as Object            // outra abstração para uma instância de tArith da dll
  Local nSizeOfArith := 64 as Numeric  // um tamanho que caiba um objeto tArith

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

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

  // caso 2: abstração para algum objeto (TLPP vai alocar o objeto e depois chamar o construtor)
  oObjCase2 := oDll:NewObj(nSizeOfArith)    // TLPP precisa dizer o tamanho em bytes do objeto 
  oDll:CallMethod("tArith::tArith()", "VP", nil, oObjCase2)
 
  // terminou? vamos sanitizar o uso da dll
  oDll:Free()
  
Return
  • Sem rótulos