Árvore de páginas

TLPP - LANGUAGE

  • MemCpy(cRet, oPointer, nBytes)
    • objetivo: fazer uma cópia de memória da DLL para uma variável TLPP. Aqui, a gente consegue fazer cópia de dados binários.
    • cRet: a variável que vai receber a cópia.
    • oPointer: um ponteiro para a área de dados na DLL. Esse ponteiro é uma abstração realizada antes pelo método newPointer (tRunDll:NewPointer).
    • nBytes: a quantidade de bytes a ser copiada.
    • retorno: lógico
      • .T.  execução com sucesso
      • .F.  execução com erro



Depois que a aplicação TLPP obtém um ponteiro para um buffer da DLL e sabe o tamanho dele, ela pode utilizar a operação MemCpy para fazer uma cópia.
Diferente do tRunDll:StrCpy, que faz cópia de string com terminador '\0', o MemCpy pode copiar um buffer binário, conforme exemplo.


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

#define EXPORT __declspec(dllexport)

EXPORT void* getBinary(int * nSize)
{
  char* p = (char *) malloc(64);
  int i = 0;

  p[i++] = 'T';
  p[i++] = 'L';
  p[i++] = 'P';
  p[i++] = 'P';
  
  p[i++] = '\0'; // um terminador zero no meio

  p[i++] = 'D';
  p[i++] = 'Y';
  p[i++] = 'N';
  p[i++] = 'C';
  p[i++] = 'A';
  p[i++] = 'L';
  p[i++] = 'L';

  p[i++] = '\0'; // um terminador zero no final

  *nSize = i;

  return p;
}
Exemplo: lado TLPP
#include "tlpp-core.th"  

Function U_DynCall()
  Local oDll as Object       // objeto de carga da dll
  Local oPtr as Object       // abstração para um ponteiro da dll
  Local nLen as Numeric      // vai guardar o tamanho do buffer
  Local cValue as Character  // armazenar um buffer que vem da dll
  
  If (IsSrvUnix())
    oDll := tRunDll():New("./dllc.so")
  Else
    oDll := tRunDll():New("dllc.dll")
  EndIf

  // Obtendo o ponteiro do buffer e o seu tamanho
  oPtr := oDll:NewPointer()
  oDll:CallFunction("getBinary", "PI", oPtr, @nLen)       

  // Copiando o buffer
  oDll:MemCpy(cValue, oPtr, nLen)
  Conout(cValue)
  
  // terminou? vamos sanitizar o uso da dll
  oDll:Free()
  
Return
  • Sem rótulos