Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Estado
subtletrue
colourGreen
titletlpp - language

  • NewPointer()
    • objetivo: criar uma abstração para um ponteiro genérico da DLL.
    • Retorno:
      • um objeto opaco que referencia um endereço na DLL.
      • este retorno é do tipo object em TLPP.


Estando do lado TLPP, via operação NewPointer, a aplicação pode manter uma abstração para algum ponteiro do lado da DLL.

De maneira geral, essa amarração se faz por dois passos: cria o objeto de abstração e depois faz uma chamada GetVar, CallFunction ou CallMethod que possa retornar o ponteiro real.

Esse exemplo pode e deve ser complementado com as operações que fazem cópia de buffer, por isso veja também tRunDll:StrCpy e tRunDll:MemCpy


Bloco de código
languagecpp
firstline1
titleExemplo: lado da biblioteca
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define EXPORT __declspec(dllexport)

EXPORT void* getPtr()
{
  char* p = (char *) malloc(64);
  strcpy_s(p, 64, "Dyncall Test");
  return p;
}
Bloco de código
languagecpp
firstline1
titleExemplo: 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

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

  // obtendo o ponteiro
  oPtr := oDll:NewPointer()
  oDll:CallFunction("getPtr", "P", oPtr)       

  // terminou? vamos sanitizar o uso da dll
  oDll:Free()
  
Return