Árvore de páginas

TLPP - LANGUAGE

Ao realizar uma chamada de função ou método de uma biblioteca dinâmica, a passagem de parâmetros pode ser feita tanto por valor quanto por referência.

Do lado da dll, sendo passagem por referência, tipicamente o parâmetro de entrada e saída é sinalizado por um operador de ponteiro '*' (vale em C e C++)  ou referência '&' (só disponível em C++).
Do lado TLPP, se emprega o usual operador '@' na hora de realizar a chamada.

Em seguida, alguns exemplos.


Exemplo: lado da biblioteca - passagem por valor
#include <stdio.h>
#include <stdlib.h>

#define EXPORT __declspec(dllexport)  

EXPORT int sucessor(int x)
{
  x += 1;
  return x;
}
Exemplo: lado TLPP - passagem por valor
#include "tlpp-core.th"  Function U_DynCall()
  Local oDll          as Object
  Local nValue := 10  as Numeric
  Local nRet   := 0   as Numeric
   
  If (IsSrvUnix())
    oDll := tRunDll():New("./dllc.so")
  Else
    oDll := tRunDll():New("dllc.dll")
  EndIf
 
  oDll:callFunction("sucessor", "II", nRet, nValue)
  Conout(nRet, nValue) // espera-se 11 e 10
 
  oDll:Free()
   
Return



Exemplo: lado da biblioteca - passagem por referência '*'
#include <stdio.h>
#include <stdlib.h>

#define EXPORT __declspec(dllexport)

EXPORT int sucessor(int * x)
{
  *x += 1;
  return *x;
}
Exemplo: lado TLPP - passagem por referência
#include "tlpp-core.th"

Function U_DynCall()
  Local oDll          as Object
  Local nValue := 10  as Numeric
  Local nRet   := 0   as Numeric
  
  If (IsSrvUnix())
    oDll := tRunDll():New("./dllc.so")
  Else
    oDll := tRunDll():New("dllc.dll")
  EndIf

  oDll:callFunction("sucessor", "II", nRet, @nValue)
  Conout(nRet, nValue)  // espera-se 11 e 11

  oDll:Free()
  
Return



Exemplo: lado da biblioteca - passagem por referência '&'
#include <stdio.h>
#include <stdlib.h>

#define EXPORT __declspec(dllexport)

class EXPORT tArith
{
public:
  static int sucessor(int& x)
  {
    x += 1;
    return x;
  }
};
Exemplo: lado TLPP - passagem por referência
#include "tlpp-core.th"

Function U_DynCall()
  Local oDll          as Object
  Local nValue := 10  as Numeric
  Local nRet   := 0   as Numeric
  
  If (IsSrvUnix())
    oDll := tRunDll():New("./dllcpp.so")
  Else
    oDll := tRunDll():New("dllcpp.dll")
  EndIf

  oDll:callFunction("tArith::sucessor(int&)", "II", nRet, @nValue)
  Conout(nRet, nValue)  // espera-se 11 e 11

  oDll:Free()
  
Return
  • Sem rótulos