Histórico da Página
Estado | ||||||
---|---|---|---|---|---|---|
|
O consumo do DynCall estabelece uma legenda própria para definição do tipo de retorno e parâmetros de uma chamada de função ou método de uma DLL.
As chamadas CallFunction, CallMethod, GetVar e SetVar (veja DynCall - Acesso às funçõesChamadas disponíveis) necessitam de informação a respeito dos tipos C ou C++ envolvidos.
Dessa forma, ficou convencionado adotar na assinatura da chamada uma letra corresponde a cada um dos tipos envolvidos, conforme o seguinte quadro.
Importante ressaltar que essa legenda não corresponde à legenda de tipos de TLPP.
É uma legenda particular do DynCall e se relaciona aos tipos baixo nível de C/C++.
Observe que a legenda é case-sensitive. Por exemplo, há a letra "C" para char e "c" para unsigned char.
letralegenda | tipo C/C++ |
V | void |
B | bool |
C | char |
c | unsigned char |
S | short |
s | unsigned short |
I | int |
i | unsigned int |
L | long |
l | unsigned long |
G | long long |
g | unsigned long long |
F | float |
D | double |
P | void * |
A | char * |
T | size_t |
A primeira letra da assinatura corresponde sempre ao tipo de retorno.
Caso hajam parâmetros na função, a assinatura segue com a legenda correspondente a cada um deles, conforme a seguinte ilustração.
A assinatura é sempre uma cadeia de caracteres de tamanho maior ou igual a 1, ou seja, mesmo que a função seja void, a letra 'V' deve ser informada.
A fim de exemplificar o modelo, vamos considerar duas funções de uma hipotética DLL em C.
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
double doCalc(int x, float y);
void printData(short a, unsigned short b, float c, unsigned long long d, char *e); |
Ao invocar essas duas funções, podemos montar da seguinte maneira a assinatura de chamada
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
Local nRet, nX, nY, nW as Numeric
Local cSignature, cValue as Character
//..... (um trecho oculto)
// assinatura para chamar doCalc
cSignature := "DIF"
oDll:CallFunction("doCalc", cSignature, nRet, nX, nY)
// assinatura para chamar printData
cSignature := "VSsFgA"
oDll:CallFunction("printData", cSignature, Nil, nX, nY, nZ, nW, cValue) |