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.
- 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
|
Import HTML Content
Visão Geral
Conteúdo das Ferramentas